基于索引矩阵的列表中包含的数据框的子集列
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
或者,使用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)))
我有一个包含许多数据帧的列表,我有一个表示感兴趣列的索引位置的矩阵,每一行代表每个连续的数据帧。我正在尝试根据矩阵对该列表中的每个数据帧进行子集化。
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
或者,使用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)))