8

我想通过与常用列&key的查找表合并,在我的 data.table中创建一个新列。然后从这个新列(, , )的值中,我想生成 3 个新列(, , )来索引data.table 中的列。index1index2keyabcabcvalue

我的 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

我尝试通过首先合并 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]
4

1 回答 1

8

由于您想在 index1 和 index2 上加入,您可以merge按原样使用,或者如果您将这些作为键分配给每个表,那么您可以简单地使用[]加入。(如DT[lookup]

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

然后您可以迭代表中的每个唯一值keylookup如下所示

 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
于 2013-02-21T15:34:50.327 回答