我有一个嵌套的数据列表。它的长度是132,每一项是一个长度为20的列表。是否有一种快速的方法可以将这种结构转换为具有132行和20列数据的数据帧?
下面是一些示例数据:
l <- replicate(
132,
as.list(sample(letters, 20)),
simplify = FALSE
)
我有一个嵌套的数据列表。它的长度是132,每一项是一个长度为20的列表。是否有一种快速的方法可以将这种结构转换为具有132行和20列数据的数据帧?
下面是一些示例数据:
l <- replicate(
132,
as.list(sample(letters, 20)),
simplify = FALSE
)
当前回答
下面这个简单的命令对我有用:
myDf <- as.data.frame(myList)
参考(Quora的答案)
> myList <- list(a = c(1, 2, 3), b = c(4, 5, 6))
> myList
$a
[1] 1 2 3
$b
[1] 4 5 6
> myDf <- as.data.frame(myList)
a b
1 1 4
2 2 5
3 3 6
> class(myDf)
[1] "data.frame"
但如果不清楚如何将列表转换为数据帧,则会失败:
> myList <- list(a = c(1, 2, 3), b = c(4, 5, 6, 7))
> myDf <- as.data.frame(myList)
函数错误(…), row.names = NULL,检查。rows = FALSE, check.names = TRUE,: 参数暗示不同的行数:3,4
注意:答案是朝着问题的标题,可能会跳过问题的一些细节
其他回答
包数据。Table中有rbindlist函数,它是do的一个超快速实现。调用(rbind列表(…))。
它可以接受一个列表的列表,data。frame或data。表作为输入。
library(data.table)
ll <- list(a = list(var.1 = 1, var.2 = 2, var.3 = 3)
, b = list(var.1 = 4, var.2 = 5, var.3 = 6)
, c = list(var.1 = 7, var.2 = 8, var.3 = 9)
, d = list(var.1 = 10, var.2 = 11, var.3 = 12)
)
DT <- rbindlist(ll)
这会返回一个数据。表继承自data.frame。
如果你真的想转换回data。frame使用as。data。frame(DT)
修正样本数据,使其符合原始描述“每个项目是一个长度为20的列表”
mylistlist <- replicate(
132,
as.list(sample(letters, 20)),
simplify = FALSE
)
我们可以像这样把它转换成一个数据帧:
data.frame(t(sapply(mylistlist,c)))
Sapply将其转换为矩阵。 data.frame将矩阵转换为数据帧。
导致:
有时你的数据可能是相同长度的向量的列表。
lolov = list(list(c(1,2,3),c(4,5,6)), list(c(7,8,9),c(10,11,12),c(13,14,15)) )
(内部向量也可以是列表,但我简化了,使其更容易阅读)。
然后可以进行如下修改。记住,你可以一次取消一个级别:
lov = unlist(lolov, recursive = FALSE )
> lov
[[1]]
[1] 1 2 3
[[2]]
[1] 4 5 6
[[3]]
[1] 7 8 9
[[4]]
[1] 10 11 12
[[5]]
[1] 13 14 15
现在用其他答案中提到的你最喜欢的方法:
library(plyr)
>ldply(lov)
V1 V2 V3
1 1 2 3
2 4 5 6
3 7 8 9
4 10 11 12
5 13 14 15
假设你的列表是L,
data.frame(Reduce(rbind, L))
Reshape2产生与上面的plyr示例相同的输出:
library(reshape2)
l <- list(a = list(var.1 = 1, var.2 = 2, var.3 = 3)
, b = list(var.1 = 4, var.2 = 5, var.3 = 6)
, c = list(var.1 = 7, var.2 = 8, var.3 = 9)
, d = list(var.1 = 10, var.2 = 11, var.3 = 12)
)
l <- melt(l)
dcast(l, L1 ~ L2)
收益率:
L1 var.1 var.2 var.3
1 a 1 2 3
2 b 4 5 6
3 c 7 8 9
4 d 10 11 12
如果你几乎没有像素,你可以在一行w/ recast()中完成这一切。