基于索引矩阵

时间:2015-08-12 17:30:37

标签: r matrix subset

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

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()没有运气)

1 个答案:

答案 0 :(得分:3)

你可以循环索引

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

或者,使用mapply操作indices行和dflist

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

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

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