我想key在我的data.table中创建一个新列,通过公共列index1&与查找表合并index2.然后从这个新的值key列(a,b,c),我想产生3个新列(a,b,c),其在指数value中data.table列.
我的data.table看起来像这样:
index1 index2 value
1 2 0 0.00
2 1 2 -5.00
3 3 2 -5.00
4 3 2 17.50
5 2 2 15.00
6 1 2 -7.50
7 3 2 3.75
8 1 2 -8.75
9 2 1 15.00
10 2 1 12.50
Run Code Online (Sandbox Code Playgroud)
查找表是这样的:
index1 index2 key
1 1 1 a
2 1 2 b
3 2 1 a
4 2 2 c
5 3 1 c
6 3 2 b
Run Code Online (Sandbox Code Playgroud)
最终结果是这样的:
index1 index2 value key a b c
1 2 0 0.00 NA NA NA NA
2 1 2 -5.00 b NA -5.00 NA
3 3 2 -5.00 b NA -5.00 NA
4 3 2 17.50 b NA 17.50 NA
5 2 2 15.00 c NA NA 15.00
6 1 2 -7.50 b NA -7.50 NA
7 3 2 3.75 b NA 3.75 NA
8 1 2 -8.75 b NA -8.75 NA
9 2 1 15.00 a 15.00 NA NA
10 2 1 12.50 a 12.50 NA NA
Run Code Online (Sandbox Code Playgroud)
我尝试通过首先合并data.table和查找表来解决它merge(),然后使用J()三次单独的时间来实现上述结果.我对data.table很新,但是我会喜欢学习一种更优雅的方法来解决这个问题,而不是多次重复这个过程.这是我的代码:
DT <- merge(DT, lookup, by=c('index1', 'index2'), all.x=TRUE)
DT <- data.table(DT) #Don't know why but DT became a data.frame after merge()
DT[J("a"), a:=value]
DT[J("b"), b:=value]
DT[J("c"), c:=value]
Run Code Online (Sandbox Code Playgroud)
由于您想要加入index1和index2,您可以merge按原样使用,或者如果将这些作为键分配给每个表,则只需使用[]即可.(如DT[lookup])
setkey(lookup, index1, index2)
setkey(DT, index1, index2)
Run Code Online (Sandbox Code Playgroud)
那么你可以在每个迭代唯一key从lookup表如下
keyVals <- unique(lookup[, key])
for (k in keyVals)
DT[lookup[key==k], c(k) := value]
Run Code Online (Sandbox Code Playgroud)
结果:
DT
# index1 index2 value a b c
# 1: 1 2 -5.00 NA -5.00 NA
# 2: 1 2 -7.50 NA -7.50 NA
# 3: 1 2 -8.75 NA -8.75 NA
# 4: 2 0 0.00 NA NA NA
# 5: 2 1 15.00 15.0 NA NA
# 6: 2 1 12.50 12.5 NA NA
# 7: 2 2 15.00 NA NA 15
# 8: 3 2 -5.00 NA -5.00 NA
# 9: 3 2 17.50 NA 17.50 NA
# 10: 3 2 3.75 NA 3.75 NA
Run Code Online (Sandbox Code Playgroud)