R: 将嵌套列表转换为数据帧,并获取列表级别als因子的名称



我有一个嵌套列表:

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个维度。

"reshape2"中的melt有一个用于lists的方法。也许在这种情况下可以使用它。类似这样的东西:

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

您可以只取消列出一个级别,而不是将行名转换为列,并将所有列连接到一个数据框架中

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

您自己的解决方案已经提供了列X1X2X3中的值,您可以执行以下操作从两个列表的名称中获取前两列Level1Level2

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))

这将导致:

  Level1 Level2 X1 X2 X3
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