我有一个嵌套列表:
list1 <- list("A"=c(1,1,1), "B"=c(2,2,2), "C"=c(3,3,3))
list2 <- list("F1" = list1, "F2" = list1)
我希望得到列表的最后一级(包含向量)作为数据帧,我想将列表的级别作为因素:
Level1 Level2 V1 V2 V3
1 F1 A 1 1 1
2 F1 B 2 2 2
3 F1 C 3 3 3
4 F2 A 1 1 1
5 F2 B 2 2 2
6 F2 C 3 3 3
第一部分很好地给出了:
data.frame(matrix(unlist(list2), ncol=3, byrow=T))
但是,我没有找到一种很好的方法来将列表级别名称作为同一数据帧中的因子。有任何想法吗? :)
修改:该程序最多可达到p维。
答案 0 :(得分:5)
melt
来自&#34; reshape2&#34;有list
的方法。也许它可以在这种情况下使用。像这样:
library(reshape2)
dcast(cbind(
coln = sequence(rapply(list2, length)),
melt(list2)), L1 + L2 ~ coln,
value.var = "value")
# L1 L2 1 2 3
# 1 F1 A 1 1 1
# 2 F1 B 2 2 2
# 3 F1 C 3 3 3
# 4 F2 A 1 1 1
# 5 F2 B 2 2 2
# 6 F2 C 3 3 3
答案 1 :(得分:2)
你可以只删除一个级别,而不是将rownames转换为列,并将all连接到一个data.frame中:
xx <- do.call(rbind,unlist(list2,recursive = FALSE))
cbind.data.frame(do.call(rbind,strsplit(rownames(xx),'.',fixed=TRUE))
,xx)
1 2 1 2 3
F1.A F1 A 1 1 1
F1.B F1 B 2 2 2
F1.C F1 C 3 3 3
F2.A F2 A 1 1 1
F2.B F2 B 2 2 2
F2.C F2 C 3 3 3
答案 2 :(得分:2)
您自己的解决方案已经提供了X1
,X2
和X3
列中的值,您可以执行以下操作来获取前两列Level1
和{{ 1}}来自两个名单的名称:
Level2
将导致此:
level1 <- as.factor(rep(names(list2), each = length(list1)))
level2 <- as.factor(rep(names(list1), times = length(list2)))
data.frame(Level1 = level1, Level2 = level2, matrix(unlist(list2), ncol=3, byrow=T))