在R中提取DT的每一行的第n列,其中n是DT

时间:2018-05-01 07:32:39

标签: r data.table

看起来很傻,但从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

1 个答案:

答案 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)]