0

假设你有这样一个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(function(x, y)  x[y], as.data.frame(t(df)), b, USE.NAMES = F)
[1]  5  2 11  8

但我想知道是否有更优雅的解决方案?

4

1 回答 1

0

您可以使用数字矩阵索引;检查矩阵和数组部分下的?"["

第三种索引形式是通过一个数字矩阵,每个维度有一列:索引矩阵的每一行然后选择数组的单个元素,结果是一个向量。索引矩阵中不允许有负索引。NA 和零值是允许的:索引矩阵中包含零的行被忽略,而包含 NA 的行在结果中产生 NA。

原始数据框有 2 个维度,因此您可以构造一个包含两列的索引矩阵,第一列表示行索引,第二列表示列索引,每对从数据框中提取一个元素,如文档:

b=c(2,1,3,2)

df[cbind(seq_len(nrow(df)), b)]
# [1]  5  2 11  8
于 2017-05-31T20:00:26.837 回答