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

时间:2013-02-21 15:13:20

标签: r data.table

我想在我的data.table中创建一个新列key,方法是使用公共列index1&的查找表进行合并。 index2。然后,根据新key列(abc)的值,我想生成3个新列(a,{ {1}},b)索引data.table中的c列。

我的data.table看起来像这样:

value

查找表是这样的:

    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 首先合并data.table和查找表来解决它,然后使用merge()三次单独的时间来实现上述结果。我对data.table很新,但是我会喜欢学习一种更优雅的方法来解决这个问题,而不是多次重复这个过程。这是我的代码:

J()

1 个答案:

答案 0 :(得分:8)

因为你想加入index1& index2,您可以使用merge,或者如果您将这些作为键分配给每个表,那么您只需使用[]即可加入。 (如DT[lookup]

 setkey(lookup, index1, index2)
 setkey(DT, index1, index2)

然后您可以从key表格中迭代每个唯一lookup,如下所示

 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