看起来很傻,但从DT中提取一个简单的问题就给我带来了麻烦。 考虑一个玩具示例: 创建一个包含5列的测试data.table:
library(data.table)
dt <- fread("
V1 V2 V3 V4 V5
1 10 7 4 3
2 11 8 5 2
3 12 9 6 1
4 1 10 7 4
5 2 11 8 4
6 3 12 9 3
7 4 1 10 3
8 5 2 11 1
9 6 3 12 2")
现在我想添加第6列V6,其中包含每行中V5中列号的列的值。所以我需要的最终输出是data.table
,它将dt转换为以下内容:
V1 V2 V3 V4 V5 V6
1: 1 10 7 4 3 7
2: 2 11 8 5 2 11
3: 3 12 9 6 1 3
4: 4 1 10 7 4 7
5: 5 2 11 8 4 8
6: 6 3 12 9 3 12
7: 7 4 1 10 3 1
8: 8 5 2 11 1 8
9: 9 6 3 12 2 6
答案 0 :(得分:4)
使用data.table
,我们可以遍历行,根据&lt; V5&#39;中的列索引对.SD
进行子集化。并指定(:=
它来创建&#39; V6&#39;
dt2[, V6 := .SD[[V5]], by = 1:nrow(dt2)]
dt2
# V1 V2 V3 V4 V5 V6
#1: 1 10 7 4 3 7
#2: 2 11 8 5 2 11
#3: 3 12 9 6 1 3
#4: 4 1 10 7 4 7
#5: 5 2 11 8 4 8
#6: 6 3 12 9 3 12
#7: 7 4 1 10 3 1
#8: 8 5 2 11 1 8
#9: 9 6 3 12 2 6
在base R
中,我们使用row/column
索引
setDF(dt2)
dt2$V6 <- dt2[cbind(seq_len(nrow(dt2)), dt2$V5)]