假设您有这样的data.frame:
df <- data.frame(matrix(1:12, 4))
df
X1 X2 X3
1 1 5 9
2 2 6 10
3 3 7 11
4 4 8 12
必须通过这些列索引逐行筛选:
b=c(2,1,3,2)
所以预期的输出应该是这样的:
c(5, 2, 11, 8)
显然,使用以下方法不是解决方案。
df[ 1:nrow(df), b]
到目前为止,我正在使用一种正在运行的mapply方法:
mapply(function(x, y) x[y], as.data.frame(t(df)), b, USE.NAMES = F)
[1] 5 2 11 8
但我想知道那里是否有更优雅的解决方案?
答案 0 :(得分:0)
您可以使用数字矩阵索引;检查?&#34; [&#34; Matrices and arrays 部分下的<&#34>
第三种形式的索引是通过带有一列的数字矩阵 对于每个维度:索引矩阵的每一行然后选择一个 数组的元素,结果是一个向量。负指数是 不允许在索引矩阵中。允许NA和零值:行 忽略包含零的索引矩阵,而忽略行 包含NA会在结果中产生NA。
原始数据框有2个维度,因此您可以构造一个包含两列的索引矩阵,第一列表示行索引,第二列表示列索引,每对从数据框中提取一个元素如文件中所述:
b=c(2,1,3,2)
df[cbind(seq_len(nrow(df)), b)]
# [1] 5 2 11 8