使用R中的data.table,我可以从表中选择变量列的向量吗?

使用R中的data.table,我可以从表中选择变量列的向量吗?,r,data.table,R,Data.table,假设我有一张像这样的桌子: > A = data.table(c(1,2,3),c(4,5,6),c(7,8,9)) > A V1 V2 V3 1: 1 4 7 2: 2 5 8 3: 3 6 9 我想选择第一行的第一列、第二行的第二列和第三行的第三列,得到结果: > B [1] 1 5 9 我试过这样的方法: B = A[,c(1,2,3)] 但这是行不通的。有可能这样做吗?(很明显,在我的实际用例中,每一行的列索引都是变量,但我可以保证一个长

假设我有一张像这样的桌子:

> A = data.table(c(1,2,3),c(4,5,6),c(7,8,9))
> A
    V1 V2 V3
1:  1  4  7
2:  2  5  8
3:  3  6  9
我想选择第一行的第一列、第二行的第二列和第三行的第三列,得到结果:

> B
[1] 1 5 9
我试过这样的方法:

B = A[,c(1,2,3)]

但这是行不通的。有可能这样做吗?(很明显,在我的实际用例中,每一行的列索引都是变量,但我可以保证一个长度等于表中行数的向量)

一种向量化的元素子集方法是将行索引和列索引作为矩阵提供

as.data.frame(A)[cbind(seq_len(nrow(A)), 1:3)]
#[1] 1 5 9
或者将
.SD
转换为
矩阵
数据.frame
并使用行/列索引

A[, as.matrix(.SD)[cbind(1:3, 1:3)]]

或者在
data.table
中,在循环中传递
i
j
索引并提取元素

A[, unlist(Map(function(i, j) .SD[i, j, with = FALSE], 1:3, 1:3), 
          use.names = FALSE)]

适用于这个特定的示例,但如果我想要的列是c(1,1,2),该怎么办?最后一列正是我需要的,谢谢!为了对以后寻找这个的人进行概括,@akrun解决方案中的第一个1:3是行ID向量,第二个是列ID向量。两者都可以用列表代替,可以重复使用,也可以不包含每个向量,但它们的长度必须相同。例如,A[,unlist(Map(函数(i,j).SD[i,j,with=FALSE],c(2,2,1,3),c(2,3,2,1)),use.names=FALSE)]返回[1]5 8 4 3