【问题标题】:Subset columns of data frames contained in list based on matrix of indices基于索引矩阵的列表中包含的数据帧的子集列
【发布时间】:2015-08-12 17:30:37
【问题描述】:

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

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

【问题讨论】:

    标签: r matrix subset


    【解决方案1】:

    你可以循环索引

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

    或者,使用mapplyindicesdflist的行进行操作

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

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

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

    【讨论】:

    • ➕1 应将1:4 替换为nrow(indices)
    • 我已经完成了1:length(dflist),但你的方法更优雅。我认为seq_along(dflist) 有效。
    • 您的 mapply 可以改为 Map(`[`, dflist, split(indices,row(indices)))
    • @Frank 是的,这更好,尽管它确实用另一个功能替换了一个额外的功能
    • @Frank 它去掉了匿名函数,但添加了Map,然后调用mapply 并使用simplify=F。
    猜你喜欢
    • 2022-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多