在 R 中使用 data.table 进行 Vlookup
Vlookup with data.table in R
首先,让我们从数据表 1 (DF1) 开始:
date id sales cost city name
1: 06/19/2016 1 149 101 MTL Bank1
2: 06/20/2016 1 150 102 MTL Bank1
3: 06/21/2016 1 151 104 MTL Bank1
4: 06/22/2016 1 152 107 MTL Bank1
5: 06/23/2016 1 155 99 MTL Bank1
6: 06/19/2016 2 84 55 NY Bank2
7: 06/20/2016 2 83 55 NY Bank2
8: 06/21/2016 2 80 56 NY Bank2
9: 06/22/2016 2 81 57 NY Bank2
10: 06/23/2016 2 97 58 NY Bank2
library(data.table)
DF1 <- data.table(c("06/19/2016", "06/20/2016", "06/21/2016", "06/22/2016",
"06/23/2016", "06/19/2016", "06/20/2016", "06/21/2016",
"06/22/2016", "06/23/2016"),
c(1, 1, 1, 1, 1, 2, 2, 2, 2, 2),
c(149, 150, 151, 152, 155, 84, 83, 80, 81, 97),
c(101, 102, 104, 107, 99, 55, 55, 56, 57, 58),
c("MTL", "MTL", "MTL", "MTL", "MTL", "NY", "NY",
"NY", "NY", "NY"))
colnames(DF1) <- c("date", "id", "sales", "cost", "city")
我想使用查找 table:
添加上面显示的列 name
id name start_date end_date status
1: 1 Bank1 06/19/2016 06/25/2016 0
2: 2 Bank2 06/27/2016 06/27/2017 0
3: 3 Bank3 06/22/2016 06/24/2017 1
4: 4 Bank3 06/23/2016 12/23/2016 1
lookup <- data.table(c(1, 2, 3, 4),
c("Bank1", "Bank2", "Bank3", "Bank3"),
c("06/19/2016", "06/27/2016", "06/22/2016", "06/23/2016"),
c("06/25/2016", "06/27/2017", "06/24/2017", "12/23/2016"),
c("0", "0", "1", "1"))
colnames(lookup) <- c("id", "name", "start_date", "end_date", "status")
在那种情况下,我会使用 id 来查找名称。当我尝试 merge
时,我总是在 DF1 中有包含 NA 的新行。
DF1<-merge(DF1, lookup[,.(id, name)], by='id', all.x=TRUE, all.y=FALSE)
我认为合并命令就是您要查找的内容,但您缺少 all.y = FALSE 位。我们在这里所做的是将 DF1 与查找数据 table 合并,我们告诉 R 包含 x 中的所有行,但仅包含 y 中与 x 中的行匹配的行,其中 x 是 DF1 和y 是查找。 lookup[.(id, name)] 意味着我们只需要列 id(与 DF1 匹配)和列 'name'。如果 DF1 中的某些行在查找中没有匹配的行,它们将显示为 NA,因为 all.x=TRUE。
设置略有不同:我假设 id 对于两个数据集都是唯一的,并且查找数据包含主数据集中存在的所有 id。
我将查找子集化为仅 ID 和名称。为了确保查找中没有重复(多个日期),我使用 unique
.
DF1[unique(lookup[, .(id, name)]), on="id"][!is.na(sales)]
id date sales cost city name
1: 1 06/19/2016 149 101 MTL Bank1
2: 1 06/20/2016 150 102 MTL Bank1
3: 1 06/21/2016 151 104 MTL Bank1
4: 1 06/22/2016 152 107 MTL Bank1
5: 1 06/23/2016 155 99 MTL Bank1
6: 2 06/19/2016 84 55 NY Bank2
7: 2 06/20/2016 83 55 NY Bank2
8: 2 06/21/2016 80 56 NY Bank2
9: 2 06/22/2016 81 57 NY Bank2
10: 2 06/23/2016 97 58 NY Bank2
这称为左连接。我在最后使用 [!is.na()] 删除在主数据集中没有观测值的第 3 组和第 4 组。
首先,让我们从数据表 1 (DF1) 开始:
date id sales cost city name
1: 06/19/2016 1 149 101 MTL Bank1
2: 06/20/2016 1 150 102 MTL Bank1
3: 06/21/2016 1 151 104 MTL Bank1
4: 06/22/2016 1 152 107 MTL Bank1
5: 06/23/2016 1 155 99 MTL Bank1
6: 06/19/2016 2 84 55 NY Bank2
7: 06/20/2016 2 83 55 NY Bank2
8: 06/21/2016 2 80 56 NY Bank2
9: 06/22/2016 2 81 57 NY Bank2
10: 06/23/2016 2 97 58 NY Bank2
library(data.table)
DF1 <- data.table(c("06/19/2016", "06/20/2016", "06/21/2016", "06/22/2016",
"06/23/2016", "06/19/2016", "06/20/2016", "06/21/2016",
"06/22/2016", "06/23/2016"),
c(1, 1, 1, 1, 1, 2, 2, 2, 2, 2),
c(149, 150, 151, 152, 155, 84, 83, 80, 81, 97),
c(101, 102, 104, 107, 99, 55, 55, 56, 57, 58),
c("MTL", "MTL", "MTL", "MTL", "MTL", "NY", "NY",
"NY", "NY", "NY"))
colnames(DF1) <- c("date", "id", "sales", "cost", "city")
我想使用查找 table:
添加上面显示的列name
id name start_date end_date status
1: 1 Bank1 06/19/2016 06/25/2016 0
2: 2 Bank2 06/27/2016 06/27/2017 0
3: 3 Bank3 06/22/2016 06/24/2017 1
4: 4 Bank3 06/23/2016 12/23/2016 1
lookup <- data.table(c(1, 2, 3, 4),
c("Bank1", "Bank2", "Bank3", "Bank3"),
c("06/19/2016", "06/27/2016", "06/22/2016", "06/23/2016"),
c("06/25/2016", "06/27/2017", "06/24/2017", "12/23/2016"),
c("0", "0", "1", "1"))
colnames(lookup) <- c("id", "name", "start_date", "end_date", "status")
在那种情况下,我会使用 id 来查找名称。当我尝试 merge
时,我总是在 DF1 中有包含 NA 的新行。
DF1<-merge(DF1, lookup[,.(id, name)], by='id', all.x=TRUE, all.y=FALSE)
我认为合并命令就是您要查找的内容,但您缺少 all.y = FALSE 位。我们在这里所做的是将 DF1 与查找数据 table 合并,我们告诉 R 包含 x 中的所有行,但仅包含 y 中与 x 中的行匹配的行,其中 x 是 DF1 和y 是查找。 lookup[.(id, name)] 意味着我们只需要列 id(与 DF1 匹配)和列 'name'。如果 DF1 中的某些行在查找中没有匹配的行,它们将显示为 NA,因为 all.x=TRUE。
设置略有不同:我假设 id 对于两个数据集都是唯一的,并且查找数据包含主数据集中存在的所有 id。
我将查找子集化为仅 ID 和名称。为了确保查找中没有重复(多个日期),我使用 unique
.
DF1[unique(lookup[, .(id, name)]), on="id"][!is.na(sales)]
id date sales cost city name
1: 1 06/19/2016 149 101 MTL Bank1
2: 1 06/20/2016 150 102 MTL Bank1
3: 1 06/21/2016 151 104 MTL Bank1
4: 1 06/22/2016 152 107 MTL Bank1
5: 1 06/23/2016 155 99 MTL Bank1
6: 2 06/19/2016 84 55 NY Bank2
7: 2 06/20/2016 83 55 NY Bank2
8: 2 06/21/2016 80 56 NY Bank2
9: 2 06/22/2016 81 57 NY Bank2
10: 2 06/23/2016 97 58 NY Bank2
这称为左连接。我在最后使用 [!is.na()] 删除在主数据集中没有观测值的第 3 组和第 4 组。