嵌套命名列表到数据框

Nested named list to data frame

我有以下来自分析的命名列表输出。可重现的代码如下:

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

没有正常工作。

有人可以帮忙吗?

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

尝试:

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

这是另一种方式:

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

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

比强制转换为 data.frame 更好的是修改它的 class,有效地告诉列表 "you're a data.frame now":

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

结果不需要用=<-分配到任何地方,因为L被修改了"in place."