【问题标题】:Create list of data.frames with specific rows from list of data.frames从 data.frames 列表中创建具有特定行的 data.frames 列表
【发布时间】:2020-06-09 18:12:08
【问题描述】:

我有许多 data.frames 存储在一个列表 (list1) 中,并想创建一个新列表 (list2) 与 data.frames 其中第一个包含 list1 中 data.frames 的所有第一行,第二个包含所有第二行等。这是一个示例:

set.seed(42)
df1 <- data.frame(a=sample.int(100,3),b=sample.int(100,3))
df2 <- data.frame(a=sample.int(100,3),b=sample.int(100,3))

list1 <- list(df1,df2)
list1

[[1]]
  a  b
1 92 84
2 93 64
3 29 51

[[2]]
  a   b
1 74  71
2 14  46
3 65 100

据此,我想创建列表 2,如下所示:

[[1]]
  a  b
1 92 84
2 74  71

[[2]]
  a   b
1 93 64
2 14  46

[[3]]
  a   b
1 29 51
2 65 100

R 中执行此操作的有效方法是什么?

【问题讨论】:

  • lapply(1:nrow(list1[[1]]), function(x) rbind(list1[[1]][x,], list1[[2]][x,]))

标签: r list dataframe rbind


【解决方案1】:

如果所有的行数相同

nr <- nrow(list1[[1]])
lapply(seq_len(nr), function(i) do.call(rbind, lapply(list1, function(x) x[i,])))

另一种选择是将其绑定到单个 data.frame,按组创建序列和 split,这将处理具有不相等行数的 lists

library(dplyr)
library(data.table)
bind_rows(list1, .id = 'grp') %>%
    mutate(rn = rowid(grp)) %>%
   {split(.[c('a', 'b')], .$rn)}

【讨论】:

    【解决方案2】:

    假设所有数据框的行数和列数相同,则以下工作:

    split(do.call(rbind, lapply(list1, function(x) x)), 
          rep(1:nrow(list1[[1]]), length(list1)))
    
    # $`1`
    # a  b
    # 1 92 84
    # 2 74  71
    # 
    # $`2`
    # a   b
    # 1 93 64
    # 2 14  46
    # 
    # $`3`
    # a   b
    # 1 29 51
    # 2 65 100
    

    【讨论】:

      【解决方案3】:
      d = lapply(list1, asplit, 1)
      Map(rbind, d[[1]], d[[2]])
      

      【讨论】:

        猜你喜欢
        • 2020-02-23
        • 2017-05-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-19
        • 1970-01-01
        • 1970-01-01
        • 2020-02-13
        相关资源
        最近更新 更多