【发布时间】:2016-06-27 20:40:13
【问题描述】:
首先,让我们从 DataTable 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")
我想使用查找表添加上面显示的列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 的新行。
【问题讨论】:
-
对于您的查找,您是否需要开始和结束日期和状态,或者是 id 和 name 足够的列?
-
id 和 name 是足够的列,但在运行脚本之前我不知道所有列,但我确信我们会有一个列 id 和一个列日期。
-
仅供参考,您应该使用
setnames通过引用添加名称。 -
无论如何,我认为你可以/应该这样做
DF1[lookup, on="id", name := i.name] -
@MaxMolina 这是在 j 中执行
x[i, on=, j]时可用的特殊语法,该语法在您键入?data.table时弹出的文档中的j参数下提到。还有一个x.前缀。在这种情况下,确保我们从i=lookup中提取列而不是从x=DF1中已经存在的列name中提取列是很有用的。这里有更多关于这种语法如何有用的信息:stackoverflow.com/q/54312225
标签: r data.table lookup vlookup