【问题标题】:Seeking an better way to add columns in data.table from lookup table寻找一种更好的方法从查找表中添加 data.table 中的列
【发布时间】:2013-02-21 15:13:19
【问题描述】:

我想通过与常用列 index1index2 的查找表合并,在我的 data.table 中创建一个新列 key。然后从这个新的key 列(abc)的值,我想生成 3 个新列(abc)来索引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

查找表是这样的:

 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() 3次来达到上述结果。我对 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]

【问题讨论】:

  • 我不太明白最后一部分:I'd like to generate 3 new columns (a,b,c) that indices the value in the data.table)。你在这里是什么意思?可以显示您的最终输出吗?另外你想如何处理NA 键?以任何一种方式合并它都会创建NA...
  • 我很抱歉。试图弄清楚如何标记代码块。现在它已经完全编辑好了。
  • 不要使用merge。请改用lookup[DT]X[Y] 语法)。当然,在这样做之前,您应该将两个表的键都设置为 index1, index2
  • 感谢@Arun 的提醒!

标签: r data.table


【解决方案1】:

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

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

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

 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

【讨论】:

  • c(k) 是很好的 LHS 语法,可以避免 with=FALSE。没想到!
  • @MD 谢谢。我从使用c(string1, string2)LHS 中进行多重分配得到了这个想法
  • @MD,在不使用lookup的密钥的时候,你能用lookup[.(k)]吗?如果是这样,那将如何工作。 (请随时使用适当的语法编辑答案)
  • 认为我误解了那个查找位。稍后将进行更深入的研究。
  • 效果很好!谢谢@RicardoSaporta!必须从 1.8.2 版升级我的 data.table() 以充分利用功能!
猜你喜欢
  • 2015-01-10
  • 1970-01-01
  • 2020-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-26
  • 1970-01-01
相关资源
最近更新 更多