【问题标题】:How to build a data frame from a nested list in R如何从 R 中的嵌套列表构建数据框
【发布时间】:2019-05-20 13:55:26
【问题描述】:

我有一个查询数据库并返回两个数据框(df1 和 df2)的列表的函数。如果我在该函数上迭代地应用,我会返回一个包含两个数据框的嵌套列表的列表。

结果列表的结构如下:

#e.g. sample list of lists of 2 data frames
A1 <- data.frame(Value =c("A","B","C"))
A2 <- data.frame(Value =c("1","2","3"))
B1 <- data.frame(Value =c("D","E","F"))
B2 <- data.frame(Value =c("4","5","6"))
C1 <- data.frame(Value =c("G","H","I"))
C2 <- data.frame(Value =c("7","8","9"))
myList <- list( list(df1 = A1, df2 = A2),
            list(df1 = B1, df2 = B2),
            list(df1 = C1, df2 = C2))

然后我想将数据框组合成它们自己独立的大数据框 - df1_All 和 df2_All。

如何从列表中提取所有 df1 数据框并将它们组合成一个更大的数据框?我在想它会使用 do.call(rbind) 构造和应用于 myList 的 apply 或 map 函数吗?

【问题讨论】:

  • 您的预期输出是什么?每个列表是否仅包含 2 个数据框,并且您希望始终交替组合它们? do.call("rbind", lapply(myList, "[[", 1))do.call("rbind", lapply(myList, "[[", 2)) 是你需要的吗?
  • purrr::map_dfr(myList, 'df1'),或者使用purrr::pmap(myList, dplyr::bind_rows)同时获得第一和第二
  • 预期输出将是由 A1、B1 和 C1 组合(绑定行)组成的数据框和 A2、B2 和 C2 的单独数据框。
  • 你能改变你的数据库查询来返回你想要的表吗?
  • @RonakShah - 类似地do.call(Map, c(rbind, myList)) 将其全部放回长度为 2 的列表中。

标签: r list lapply purrr


【解决方案1】:

根据 Ronak Shah 对我的问题的评论,这是我的答案:

dfX1 <- data.frame(do.call("rbind",lapply(myList,"[[","df1")))
dfX2 <- data.frame(do.call("rbind",lapply(myList,"[[","df2"))) 

【讨论】:

    【解决方案2】:
    myList %>% 
       pmap(.,bind_rows) %>% 
       bind_cols()
      Value Value1
    1     A      1
    2     B      2
    3     C      3
    4     D      4
    5     E      5
    6     F      6
    7     G      7
    8     H      8
    9     I      9
    

    【讨论】:

      【解决方案3】:

      编辑:以下代码未创建所需的输出(OP 在我起草后澄清了预期的输出)

      让我们创建一个自定义函数。您的数据框似乎处于相同的位置,所以让我们利用这种规律性:

      getDataFrame <- function(mylist, wantx) {
        df <- sapply(myList, `[[`, wantx)
        names(df) <- paste0("Name", seq(1:length(mylist)))
        df <- as_tibble(df)
        return(df)
      }
      

      所以,

      getDataFrame(myList, 1)
      

      返回:

      # A tibble: 3 x 3
        Name1 Name2 Name3
        <fct> <fct> <fct>
      1 A     D     G    
      2 B     E     H    
      3 C     F     I 
      

      同样:

      > getDataFrame(myList, 2)
      # A tibble: 3 x 3
        Name1 Name2 Name3
        <fct> <fct> <fct>
      1 1     4     7    
      2 2     5     8    
      3 3     6     9    
      

      如果您不希望它们成为因子,则必须在之后对其进行转换。希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-12-06
        • 2022-08-03
        • 2021-05-24
        • 2013-05-12
        • 2021-04-20
        • 2023-04-06
        • 2022-09-27
        • 1970-01-01
        相关资源
        最近更新 更多