2015-11-03 91 views
2

我从分析中得到以下命名列表输出。可重现的代码如下:将命名列表嵌套到R中的数据帧中

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

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

尝试:

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

这里的另一种方式:

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

它是如何工作。lapply返回一个列表;与c结合的两个清单又作了一个清单;并且列表很容易被强制转换为数据帧,因为后者只是具有相同长度的向量列表。

比强制的data.frame更好的只是修改其类,有效地告诉列表“你现在是一个data.frame”:

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

结果并不需要在任何地方分配与=<-,因为L被修改为“就位”。