数据集中的列表不完整

时间:2016-07-13 08:30:10

标签: r list dataframe

这是一个小清单:

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

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

5 个答案:

答案 0 :(得分:7)

melt的{​​{1}}功能也适用于列表。所以你可以使用:

reshape2

我相信你知道如何更改名字。

答案 1 :(得分:5)

以下是基础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在评论中所述,sapply(foo, length)可以替换为lengths(foo)

答案 2 :(得分:3)

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

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

答案 3 :(得分:1)

melt非常酷(system.time为1.74,列表为10k)和@ jbaums&#39;当unlist被使用时,lengths解决方案同样快(1.72),但@ akrun的stack解决方案获胜会导致它如此快得离谱(0.06)。正如预期的那样,循环最慢(21.86)。

答案 4 :(得分:0)

这适用于给定的示例:

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, 哈德