首页 > 解决方案 > 将列表(列表转换为列表形式)重塑为数据框 - R

问题描述

让我有下面的列表(list2),其中列表的元素也是一个列表:

> dput(list2)
list(x = list(a = c(0.18, 0.7, 0.57, 0.17, 0.94), b = c(0.18, 
0.7, 0.57, 0.17, 0.94)), y = list(a = c(0.18, 0.7, 0.57, 0.17, 
0.94), b = c(0.18, 0.7, 0.57, 0.17, 0.94)), z = list(a = c(0.18, 
0.7, 0.57, 0.17, 0.94), b = c(0.18, 0.7, 0.57, 0.17, 0.94)))

我在哪里生成了如下列表:

names1<-c("a","b")
names2<-c("x","y","z")
list1<-list()
list2<-list()
for(i in names1)
  for(j in names2){{
    set.seed(2)
  list1[[i]]<-round(runif(5),2)
  list2[[j]]<-list1
}}

我想将此列表重塑为以下数据框:

   n1 n2   n3
1   x  a 0.18
2   x  a 0.70
3   x  a 0.57
4   x  a 0.17
5   x  a 0.94
6   x  b 0.18
7   x  b 0.70
8   x  b 0.57
9   x  b 0.17
10  x  b 0.94
11  y  a 0.18
12  y  a 0.70
13  y  a 0.57
14  y  a 0.17
15  y  a 0.94
16  y  b 0.18
17  y  b 0.70
18  y  b 0.57
19  y  b 0.17
20  y  b 0.94
21  z  a 0.18
22  z  a 0.70
23  z  a 0.57
24  z  a 0.17
25  z  a 0.94
26  z  b 0.18
27  z  b 0.70
28  z  b 0.57
29  z  b 0.17
30  z  b 0.94

我该如何重塑列表?我的原始列表比上面的例子大得多。

非常感谢。

标签: rlistdataframereshape

解决方案


基本 R 选项

setNames(
  `row.names<-`(rev(
    do.call(
      rbind,
      Map(cbind,
        Map(stack, list2),
        n = names(list2)
      )
    )
  ), NULL),
  paste0("n", 1:3)
)

   n1 n2   n3
1   x  a 0.18
2   x  a 0.70
3   x  a 0.57
4   x  a 0.17
5   x  a 0.94
6   x  b 0.18
7   x  b 0.70
8   x  b 0.57
9   x  b 0.17
10  x  b 0.94
11  y  a 0.18
12  y  a 0.70
13  y  a 0.57
14  y  a 0.17
15  y  a 0.94
16  y  b 0.18
17  y  b 0.70
18  y  b 0.57
19  y  b 0.17
20  y  b 0.94
21  z  a 0.18
22  z  a 0.70
23  z  a 0.57
24  z  a 0.17
25  z  a 0.94
26  z  b 0.18
27  z  b 0.70
28  z  b 0.57
29  z  b 0.17
30  z  b 0.94

推荐阅读