【问题标题】:Convert list of lists into single nested row of a data.frame or tibble (R)将列表列表转换为 data.frame 或 tibble (R) 的单个嵌套行
【发布时间】:2020-10-20 09:00:30
【问题描述】:

我有一个嵌套列表:

data = list(a = list(1, 2, 3), b = list("foo"), c = list("toast", "onions"))

如何将其转换为 data.frame 或 tibble 的单行?我希望将包含多个元素的列表(此处为ac)保留为列表,并将单个元素(b)保留为常规值。

预期输出是:

# A tibble: 1 x 3
  a          b     c         
  <list>     <chr> <list>    
1 <list [3]> foo   <list [2]>

【问题讨论】:

  • tibble::enframe(data) %&gt;% tidyr::pivot_wider() ?
  • 是的,这对我有用 Ronak。谢谢你的帮助。然后将列 b 转换为常规字符列的最佳方法是什么?我试过... %&gt;% mutate(b = map(b, unlist)),但这不会改变实际的列类型。
  • [Ronak] + %&gt;% tidyr::unnest(b) %&gt;% tidyr::unnest(b)
  • 谢谢罗纳克。如果我将map 更改为map_chr 也可以使用,即`... %>% mutate(b = map_chr(b, unlist))'。

标签: r list tibble


【解决方案1】:

这个怎么样?

> as_tibble_row(Map(function(x) ifelse(length(x)==1,unlist(x),list(x)),data))
# A tibble: 1 x 3
  a          b     c
  <list>     <chr> <list>
1 <list [3]> foo   <list [2]>

【讨论】:

    【解决方案2】:

    您可以使用enframe + pivot_wider

    tibble::enframe(data) %>% tidyr::pivot_wider() 
    #      a          b          c         
    #  <list>     <list>     <list>    
    #1 <list [3]> <list [1]> <list [2]>
    

    要获得长度一列作为向量,我们可以添加:

    library(dplyr)
    
    tibble::enframe(data) %>% 
      tidyr::pivot_wider() %>%
      summarise(across(.fns = ~if(length(unlist(.)) == 1) unlist(.) else .))
    
    #      a          b     c         
    #  <list>     <chr> <list>    
    #1 <list [3]> foo   <list [2]>
    

    【讨论】:

      【解决方案3】:
      data[] <- lapply(data, function(x) if (length(x) == 1) x[[1]] else list(x))
      data.table::setDF(data)
      
      # > str(data)
      # 'data.frame': 1 obs. of  3 variables:
      #  $ a:List of 1
      #   ..$ :List of 3
      #   .. ..$ : num 1
      #   .. ..$ : num 2
      #   .. ..$ : num 3
      #  $ b: chr "foo"
      #  $ c:List of 1
      #   ..$ :List of 2
      #   .. ..$ : chr "toast"
      #   .. ..$ : chr "onions"
      

      【讨论】:

        【解决方案4】:

        一个选项是使用来自base Raggregate 创建一个两列数据集

        aggregate(values ~ ind, stack(data), list)
        

        【讨论】:

          猜你喜欢
          • 2016-06-17
          • 1970-01-01
          • 2015-02-03
          • 2021-12-10
          • 2015-05-28
          • 1970-01-01
          • 2020-07-17
          • 1970-01-01
          • 2017-12-22
          相关资源
          最近更新 更多