R 正在寻找从查找表在data.table中添加列的更好方法

R 正在寻找从查找表在data.table中添加列的更好方法,r,data.table,R,Data.table,我想通过按公共列index1&index2与查找表合并,在我的data.table中创建一个新列key。然后从这个新的键列(a,b,c)的值中,我想生成3个新列(a,b,c),对data.table中的值列进行索引 我的data.table如下所示: index1 index2 value 1 2 0 0.00 2 1 2 -5.00 3 3 2 -5.00 4

我想通过按公共列
index1
&
index2
与查找表合并,在我的data.table中创建一个新列
key
。然后从这个新的
列(
a
b
c
)的值中,我想生成3个新列(
a
b
c
),对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
查找表如下所示:

 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
最终结果如下:

    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
我试图解决这个问题,首先通过
merge()
合并data.table和查找表,然后分别使用
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]

DT由于您希望在index1和index2上进行连接,您可以使用现有的
merge
,或者如果您将这些作为键分配给每个表,那么您可以简单地使用
[]
进行连接。(如
DT[lookup]

然后您可以从
查找
表中迭代每个唯一的
,如下所示

 keyVals <- unique(lookup[, key])

 for (k in keyVals)
   DT[lookup[key==k], c(k) := value]

我不太明白最后一部分:
我想生成3个新列(a、b、c),对data.table中的值进行索引)
。你这是什么意思?可以显示您的最终输出吗?另外,您希望如何处理
NA
键?无论哪种方式合并,都会产生
NA
…我的道歉。正在试图找出如何标记代码块。现在它已完全编辑。不要使用
merge
。改用
lookup[DT]
X[Y]
语法)。当然,在执行此操作之前,您应该将这两个表的键设置为
index1,index2
。感谢@Arun的帮助
c(k)
是很好的LHS语法,可以避免
with=FALSE
。我没想到@谢谢。我是通过在
LHS
@MD中使用
c(string1,string2)
进行多重赋值得到这个想法的,当不使用
lookup
键时,你能使用
lookup[(k)]
吗?如果是的话,那该怎么办呢。(请随意用适当的语法编辑答案)我想我误解了那个查找位。稍后将进行更深入的研究。锻炼得很好!谢谢@RicardoSaporta!必须从1.8.2版升级我的data.table(),才能充分利用电源!
 keyVals <- unique(lookup[, key])

 for (k in keyVals)
   DT[lookup[key==k], c(k) := value]
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