嵌套的命名列表到数据框

时间:2015-11-03 05:24:40

标签: r list dataframe nested

我从分析中得到以下命名列表输出。可重现的代码如下:

list(structure(c(-213.555409754509, -212.033637890131, -212.029474755074, 
-211.320398316741, -211.158815833294, -210.470525157849), .Names = c("wasn", 
"chappal", "mummyji", "kmph", "flung", "movie")), structure(c(-220.119433774144, 
-219.186901747536, -218.743319709963, -218.088361753899, -217.338920075687, 
-217.186050877079), .Names = c("crazy", "wired", "skanndtyagi", 
"andr", "unveiled", "contraption")))

我想将其转换为数据框。我已经尝试使用reshape2,dplyr以及为将列表转换为数据框而给出的其他解决方案的数据框选项取消列表但没有太大成功。我正在寻找的输出是这样的:

  Col1        Val1      Col2          Val2
1 wasn      -213.55     crazy         -220.11
2 chappal   -212.03     wired         -219.18
3 mummyji   -212.02     skanndtyagi   -218.74
等等等等。实际的输出有多个具有配对值的列,并且可以运行多行。我已经尝试过以下代码:

do.call(rbind, lapply(df, data.frame, stringsAsFactors = TRUE)) 

部分提供了列中的所有字符值和第二个中的数值。

data.frame(Reduce(rbind, df))

没有工作 - 提供第一个列表中的名称和两个列表中的数字拖曳不同的行

colNames <- unique(unlist(lapply(df, names)))
M <- matrix(0, nrow = length(df), ncol = length(colNames), 
        dimnames = list(names(df), colNames))
matches <- lapply(df, function(x) match(names(x), colNames))
M[cbind(rep(sequence(nrow(M)), sapply(matches, length)),
    unlist(matches))] <- unlist(df)
M

无法正常工作。

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:3)

由于列表元素的长度都相同,因此您应该能够stack它们,然后按列进行组合。

尝试:

do.call(cbind, lapply(myList, stack))

答案 1 :(得分:2)

这是另一种方式:

as.data.frame( c(col = lapply(x, names), val = lapply(x,unname)) )

工作原理。 lapply返回一个列表;两个列表与c组合成另一个列表;并且列表很容易被强制转换为data.frame,因为后者只是具有相同长度的向量列表。

优于强制转换到data.frame只是修改它的类,有效地告诉列表&#34;你现在是一个data.frame&#34;:

L = c(col = lapply(x, names), val = lapply(x,unname))
library(data.table)
setDF(L)

不需要将结果分配到=<-的任何位置,因为L已被修改&#34;到位。&#34;