基于索引矩阵的列表中包含的数据框的子集列

Subset columns of data frames contained in list based on matrix of indices

我有一个包含许多数据帧的列表,我有一个表示感兴趣列的索引位置的矩阵,每一行代表每个连续的数据帧。我正在尝试根据矩阵对该列表中的每个数据帧进行子集化。

df1 <- data.frame(id=letters[1:4], result1=1:4, result2=1:4, result3=1:4)
df2 <- data.frame(id=letters[1:4], result1=5:8, result2=1:4, result3=1:4)
df3 <- data.frame(id=letters[1:4], result1=9:12, result2=1:4, result3=1:4)
df4 <- data.frame(id=letters[1:4], result1=13:16, result2=1:4, result3=1:4)
dflist <- list(df1, df2, df3, df4)

indices <- matrix(c(1,1,1,1,2,2,4,3),nrow=4, ncol=2)

所以数据框看起来像这样:

[[1]]
  id result1 result2 result3
1  a       1       1       1
2  b       2       2       2
3  c       3       3       3
4  d       4       4       4

[[2]]
  id result1 result2 result3
1  a       5       1       1
2  b       6       2       2
3  c       7       3       3
4  d       8       4       4

[[3]]
  id result1 result2 result3
1  a       9       1       1
2  b      10       2       2
3  c      11       3       3
4  d      12       4       4

[[4]]
  id result1 result2 result3
1  a      13       1       1
2  b      14       2       2
3  c      15       3       3
4  d      16       4       4

索引矩阵如下所示

     [,1] [,2]
[1,]    1    2
[2,]    1    2
[3,]    1    4
[4,]    1    3

从第一个数据框中,我想要第 1 列和第 2 列的子集,从第二个数据框中,我想要第 1、2 列,从第三个数据框中,我想要第 1 和第 4 列,依此类推。

我可以通过以下方式一一实现:

dflist[[1]][indices[1,]]

但我想不出一种方法来一次完成所有操作(我尝试了 lapply()sapply(),但没有成功)

你可以在索引上循环

lapply(1:4, function(i) dflist[[i]][indices[i,]])  # or 1:nrow(indices) as @bgoldst suggests

或者,使用mapplyindices行和dflist

行进行操作
mapply(function(a, b) a[,b], dflist, split(indices, row(indices)), SIMPLIFY = F)

这可以按照@Frank 的建议进一步简化,使用 Mapmapply 的包装器)并删除匿名函数

Map(`[`, dflist, split(indices,row(indices)))