寻求一种更好的方法来从查找表中添加data.table中的列

Sea*_*anM 8 r data.table

我想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)

Ric*_*rta 8

由于您想要加入index1和index2,您可以merge按原样使用,或者如果将这些作为键分配给每个表,则只需使用[]即可.(如DT[lookup])

 setkey(lookup, index1, index2)
 setkey(DT, index1, index2)
Run Code Online (Sandbox Code Playgroud)

那么你可以在每个迭代唯一keylookup表如下

 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)