我有一个包含许多数据框的列表,我有一个表示感兴趣列的索引位置的矩阵,每个连续数据帧的每一行。我试图根据矩阵对该列表中的每个数据帧进行子集化。
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()
没有运气)
答案 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的建议进一步简化,使用Map
(mapply
的包装器)并删除匿名函数
Map(`[`, dflist, split(indices,row(indices)))