【问题标题】:flatten list column within dataframe in R展平R中数据框中的列表列
【发布时间】:2020-05-31 21:38:33
【问题描述】:

我有一个包含两列列表的数据框。

test <- data.frame(var_1 = c("ONE", "TWO"))

test$var_2 <- c(list(data.frame(Date = c("Date 1", "Date 2")), list(data.frame(Date = c("Date 3", "Date 4", "Date 5")))))                   
test$var_3 <- c(list(data.frame(Name = c("Name 1", "Name 2")), list(data.frame(Date = c("Name 3", "Name 4", "Name 5")))))                   

我想循环遍历列表以创建一个扁平的数据框,重复 var_1 以获得每行列表的长度

期望的输出

data.frame(var_1 = c("ONE", "ONE", "TWO", "TWO", "TWO"),
           Date = c("Date 1", "Date 2", "Date 3", "Date 4", "Date 5"),
           Name = c("Name 1", "Name 2", "Name 3", "Name 4", "Name 5"))


  var_1   Date   Name
1   ONE Date 1 Name 1
2   ONE Date 2 Name 2
3   TWO Date 3 Name 3
4   TWO Date 4 Name 4
5   TWO Date 5 Name 5

我尝试应用一些建议的解决方案,例如使用这篇文章Flatten list column in data frame with ID column 中的unnest,但这并没有完全达到我想要的结果。

【问题讨论】:

    标签: r dataframe data.table lapply purrr


    【解决方案1】:

    使用data.table的选项:

    setDT(test)[, c(.(var_1=var_1), do.call(cbind.data.frame, list(var_2, var_3))), var_1][, 
        (1L) := NULL][]
    

    输出:

       var_1   Date   Name
    1:   ONE Date 1 Name 1
    2:   ONE Date 2 Name 2
    3:   TWO Date 3 Name 3
    4:   TWO Date 4 Name 4
    5:   TWO Date 5 Name 5
    

    数据:

    test <- data.frame(var_1 = c("ONE", "TWO"))
    
    test$var_2 <- c(list(data.frame(Date = c("Date 1", "Date 2")), list(data.frame(Date = c("Date 3", "Date 4", "Date 5")))))                   
    test$var_3 <- c(list(data.frame(Name = c("Name 1", "Name 2")), list(data.frame(Name = c("Name 3", "Name 4", "Name 5")))))                   
    

    【讨论】:

      【解决方案2】:

      这是我们unlist'var_2'、'var_3'和unnest的一个选项

      library(dplyr)
      library(purrr)
      library(tidyr)
      test %>% 
          group_split(var_1) %>%
          map_dfr(~ .x %>% 
                      mutate_at(-1, ~ list(unlist(.))) %>% 
                      unnest(c(var_2, var_3)))
      # A tibble: 5 x 3
      #  var_1 var_2  var_3 
      #  <fct> <fct>  <fct> 
      #1 ONE   Date 1 Name 1
      #2 ONE   Date 2 Name 2
      #3 TWO   Date 3 Name 3
      #4 TWO   Date 4 Name 4
      #5 TWO   Date 5 Name 5
      

      或者我们可以这样做

      test %>%
           rowwise %>%
           summarise_all(~ list(unlist(.))) %>%
           unnest(cols = everything())
      # A tibble: 5 x 3
      #  var_1 var_2  var_3 
      #  <fct> <fct>  <fct> 
      #1 ONE   Date 1 Name 1
      #2 ONE   Date 2 Name 2
      #3 TWO   Date 3 Name 3
      #4 TWO   Date 4 Name 4
      #5 TWO   Date 5 Name 5
      

      或与

      test  %>% 
          group_by(var_1) %>%
          nest %>% 
          mutate(data = map(data, ~ summarise_all(.x, ~ list(unlist(.))) %>% 
          unnest(everything())))   %>% 
          unnest(data)
      

      【讨论】:

        猜你喜欢
        • 2019-03-08
        • 2018-11-09
        • 2015-07-26
        • 2016-03-16
        • 2020-08-08
        • 1970-01-01
        • 2014-12-04
        • 1970-01-01
        • 2017-08-09
        相关资源
        最近更新 更多