【问题标题】:Incomplete list into dataframe不完整的列表进入数据框
【发布时间】:2016-07-13 08:30:09
【问题描述】:

这里有一个小清单:

foo <- list(c("johnny", "joey"), character(0), "deedee")

[[1]]
[1] "johnny" "joey"  

[[2]]
character(0)

[[3]]
[1] "deedee"

我怎样才能把它转换成这个数据框?

  list_item   name
1         1 johnny
2         1   joey
3         3 deedee

我见过的所有列表到数据框的解决方案都不起作用,因为我的列表不完整。

【问题讨论】:

    标签: r list dataframe


    【解决方案1】:

    reshape2 包的 melt 函数也适用于列表。所以你可以使用:

    library(reshape2)
    melt(foo)
    #   value L1
    #1 johnny  1
    #2   joey  1
    #3 deedee  3
    

    我相信你知道之后如何更改名称。

    【讨论】:

      【解决方案2】:

      这是使用基础 R 的一种方法:

      data.frame(list_item=rep(seq_along(foo), sapply(foo, length)), 
                 name=unlist(foo))
      
      
      ##   list_item   name
      ## 1         1 johnny
      ## 2         1   joey
      ## 3         3 deedee
      

      正如@RichardScriven 在cmets 中提到的,sapply(foo, length) 可以替换为lengths(foo)

      【讨论】:

        【解决方案3】:

        将'foo'的names设置为'foo'的序列后,我们可以使用base R中的stack

        stack(setNames(foo, seq_along(foo))) 
        #    values ind
        #1 johnny   1
        #2   joey   1
        #3 deedee   3
        

        【讨论】:

          【解决方案4】:

          melt 非常酷(对于 10k 的列表,system.time 1.74)和@jbaums 的unlist 解决方案在使用lengths 时同样快(1.72),但@akrun 的stack 解决方案胜出因为它太快了(0.06)。正如预期的那样,循环是最慢的 (21.86)。

          【讨论】:

            【解决方案5】:

            这适用于给定的示例:

            foo <- list(c("johnny", "joey"), character(0), "deedee")
            
            result=data.frame()
            for(listitem.no in 1:length(foo)){
              for(vectoritem in foo[[listitem.no]])
                result <- rbind(result, c(listitem.no, as.character(vectoritem)),
                                stringsAsFactors=FALSE)
            }
            

            HTH, 伯恩哈德

            【讨论】:

              猜你喜欢
              • 2020-05-11
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2019-07-12
              • 2021-01-31
              • 1970-01-01
              • 2020-01-10
              相关资源
              最近更新 更多