将嵌套列表转换为数据框

Convert nested list into dataframe

我在Whosebug上看到类似问题的回答,但是我找不到适合我具体情况的方法,所以我打开了一个新的。

我的目标是像这样转换嵌套列表:

a:list of 2
..$ time: num[1:5] 1 2 3 4 5
..$ int: num[1:5] 6 7 8 9 0

b:list of 2
..$ time: num[1:5] 1 2 3 4 5
..$ int: num[1:5] 6 7 8 9 0

进入这样的数据框:

Name time int
a    1    6
a    2    7
.
.
.
b    1    6
...

我尝试在 reshape2 中使用 melt,我得到了时间和整数作为一列 (L2) 中的值。像这样:

Value L2    L1
1     time  a
2     time  a
.
.
.
6     int   a
.
.
.

rbindlist 来自 data.table 包应该做

## some dummy data
lst <- list(a = list(time = c(1,2,3),
                     int = c(5,6,7)),
            b = list(time = c(1,2,3,4),
                     int = c(1,2,3,4)))

# str(lst)
# List of 2
# $ a:List of 2
# ..$ time: num [1:3] 1 2 3
# ..$ int : num [1:3] 5 6 7
# $ b:List of 2
# ..$ time: num [1:4] 1 2 3 4
# ..$ int : num [1:4] 1 2 3 4

library(data.table)

rbindlist(lst, idcol = "id")

#     id time int
# 1:  a    1   5
# 2:  a    2   6
# 3:  a    3   7
# 4:  b    1   1
# 5:  b    2   2
# 6:  b    3   3
# 7:  b    4   4

如果你想把它作为 data.frame

df <- rbindlist(lst, idcol = "id")
setDF(df)

# str(df)
# 'data.frame': 7 obs. of  3 variables:
# $ id  : chr  "a" "a" "a" "b" ...
# $ time: num  1 2 3 1 2 3 4
# $ int : num  5 6 7 1 2 3 4

您可以使用 plyr 包中的 ldply

library(plyr)
ldply(lst, data.frame, .id = "Name")

从@SymbolixAU 的回答中获取虚拟数据,输出为

#  Name time int
#1   a    1   5
#2   a    2   6
#3   a    3   7
#4   b    1   1
#5   b    2   2
#6   b    3   3
#7   b    4   4