这是一个小清单:
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
我见过的所有列表到数据帧的解决方案都不起作用,因为我的列表不完整。
答案 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, 哈德