我需要从data.table中的列交叉引用到其中的多个其他列。作为一个例子,我有:
library(data.table)
dt = data.table(mtcars)
sub = dt[1:3]
sub[, v1 := ('vs', 'am', 'gear')]
head(dt)
mpg cyl disp hp drat wt qsec vs am gear carb
21.0 6 160 110 3.90 2.620 16.46 0 1 4 4
21.0 6 160 110 3.90 2.875 17.02 0 1 4 4
22.8 4 108 93 3.85 2.320 18.61 1 1 4 1
因此列v1包含应该采用哪个列的信息。所以对于sub我想要一个具有值的新列: 第1行:列中的值' vs'从第一行开始 第2行:来自列' am'的值从第二排 第3行:'齿轮的第三行的值 简而言之,像一个data.table,如
mpg cyl disp hp drat wt qsec vs am gear carb v1 v2
21.0 6 160 110 3.90 2.620 16.46 0 1 4 4 vs 0
21.0 6 160 110 3.90 2.875 17.02 0 1 4 4 am 1
22.8 4 108 93 3.85 2.320 18.61 1 1 4 1 gear 4
不幸的是像
sub[, v2 := get(value))]
或
sub[, v2 := get((sub$value))]
不会导致解决方案,因为v2将等于[0,0,1]
但不会[0,1,4]
提前致谢
答案 0 :(得分:2)
好吧,这比我想象的要容易,但是对于那些希望通过相应列实现类似功能的人来说,解决了我的问题。所以解决方案是:
sub[, v2 := get(c(value)), by = value]
这导致了期望的结果:
head(sub[, .(mpg, v1, v2 )]
mpg v1 v2
21.0 vs 0
21.0 am 1
22.8 gear 4