嵌套命名列表到数据框
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."
我有以下来自分析的命名列表输出。可重现的代码如下:
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."