【问题标题】:How to deal with lists of lists when the first index represents rows?当第一个索引表示行时如何处理列表列表?
【发布时间】:2018-02-01 17:47:39
【问题描述】:

如何将列表列表转换为 DataFrame,其中列表的第一个“层”应该是行?

myList = list(
    list(name="name1",num=20,dogs=list("dog1")),
    list(name="name2",num=13,dogs = list()),
    list(name="name3",num=5,dogs=list("dog2","dog4"))
)

我的第一个想法是取消列出“第三层”中的元素

myUnList = sapply(myList,function(x){y=x;y$dogs = unlist(y$dogs);y})

我可以创建一个小标题

tibble(myUnList)
# A tibble: 3 x 1
    myUnList
      <list>
1 <list [3]>
2 <list [2]>
3 <list [3]>

请注意,如果我有myList[[1]] 来表示name 的向量,那会很简单,但是我在如何整理以另一种方式呈现的数据时遇到了麻烦。我想使用purrr 来“反转”顺序。

预期结果:

# A tibble: 3 x 3
      names       num       dogs
     <list>    <list>     <list>
1 <chr [1]> <dbl [1]> <list [1]>
2 <chr [1]> <dbl [1]> <list [0]>
3 <chr [1]> <dbl [1]> <list [2]>

是否有其他类型的数据结构支持可变长度条目?

【问题讨论】:

    标签: r list tibble


    【解决方案1】:

    我们可以使用purrr 包中的map 函数提取列表元素,然后使用data_frame 创建一个新的tibble。

    图书馆(tidyverse)

    dat <- data_frame(name = map_chr(myList, "name"),
                      num = map_dbl(myList, "num"),
                      dogs = map(myList, "dogs"))
    dat
    # # A tibble: 3 x 3
    #    name    num dogs      
    #   <chr> <dbl> <list>    
    # 1 name1 20.0  <list [1]>
    # 2 name2 13.0  <NULL>    
    # 3 name3  5.00 <list [2]>
    

    如果您希望所有内容都在列表列中,请将map_chrmap_dbl 替换为map

    dat <- data_frame(name = map(myList, "name"),
                      num = map(myList, "num"),
                      dogs = map(myList, "dogs"))
    dat
    #   name      num       dogs      
    #   <list>    <list>    <list>    
    # 1 <chr [1]> <dbl [1]> <list [1]>
    # 2 <chr [1]> <dbl [1]> <NULL>    
    # 3 <chr [1]> <dbl [1]> <list [2]>
    

    【讨论】:

      【解决方案2】:

      在使用purrr 玩了一段时间后,我得到了另一个不需要输入名称的解决方案(对于非常大的列表可能会很麻烦)。

      myList %>% transpose %>% simplify_all %>% tbl_df
      

      结果

      # A tibble: 3 x 3
         name   num       dogs
        <chr> <dbl>     <list>
      1 name1    20 <list [1]>
      2 name2    13 <list [0]>
      3 name3     5 <list [2]>
      

      purrr 中的 transpose 函数自动进行这种类型的转换。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多