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