【发布时间】:2013-02-21 15:13:19
【问题描述】:
我想通过与常用列 index1 和 index2 的查找表合并,在我的 data.table 中创建一个新列 key。然后从这个新的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
查找表是这样的:
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