【发布时间】:2015-06-23 09:29:17
【问题描述】:
我有一个列表列表,我想将其转换为数据框。挑战在于列表中缺少变量名称(不是NA,但变量完全丢失)。
举例说明:来自
my_list <- list()
my_list[[1]] <- list(a = 1, b = 2, c = 3)
my_list[[2]] <- list(a = 4, c = 6)
我想买
a b c
[1,] 1 2 3
[2,] 4 NA 6
【问题讨论】:
我有一个列表列表,我想将其转换为数据框。挑战在于列表中缺少变量名称(不是NA,但变量完全丢失)。
举例说明:来自
my_list <- list()
my_list[[1]] <- list(a = 1, b = 2, c = 3)
my_list[[2]] <- list(a = 4, c = 6)
我想买
a b c
[1,] 1 2 3
[2,] 4 NA 6
【问题讨论】:
另一种选择是
library(reshape2)
as.data.frame(acast(melt(my_list), L1~L2, value.var='value'))
# a b c
#1 1 2 3
#2 4 NA 6
或者正如@David Arenburg 建议的那样,melt/dcast 的包装器将是 recast
recast(my_list, L1 ~ L2, value.var = 'value')[, -1]
# a b c
#1 1 2 3
#2 4 NA 6
【讨论】:
recast(my_list, L1 ~ L2, value.var = 'value')[, -1],虽然-1可能很丑。
acast 矩阵输出的选项
您可以使用dplyr 包中的bind_rows 函数:
my_list <- list()
my_list[[1]] <- list(a = 1, b = 2, c = 3)
my_list[[2]] <- list(a = 4, c = 6)
dplyr::bind_rows(lapply(my_list, as.data.frame))
这个输出:
Source: local data frame [2 x 3]
a b c
1 1 2 3
2 4 NA 6
【讨论】:
data.table::rbindlist(lapply(my_list, as.data.frame), fill = TRUE)
另一个答案,这需要将参数的类更改为 data.frames:
library(plyr)
lista <- list(a=1, b=2, c =3)
listb <- list(a=4, c=6)
lista <- as.data.frame(lista)
listb <- as.data.frame(listb)
my_list <- list(lista, listb)
my_list <- do.call(rbind.fill, my_list)
my_list
a b c
1 1 2 3
2 4 NA 6
【讨论】:
my_list <- lapply(my_list, as.data.frame) ; do.call(rbind.fill, my_list)