使用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