我在stackoverflow中看到了类似的问题,但我找不到适合我的具体情况的方法,所以我打开一个新的.
我的目标是转换嵌套列表,如下所示:
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
Run Code Online (Sandbox Code Playgroud)
进入这样的数据帧:
Name time int
a 1 6
a 2 7
.
.
.
b 1 6
...
Run Code Online (Sandbox Code Playgroud)
我尝试使用meltin reshape2,我得到时间和int作为一列(L2)中的值.像这样的东西:
Value L2 L1
1 time a
2 time a
.
.
.
6 int a
.
.
.
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
如果你想把它当成一个 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
Run Code Online (Sandbox Code Playgroud)
你可以ldply从plyr包中使用
library(plyr)
ldply(lst, data.frame, .id = "Name")
Run Code Online (Sandbox Code Playgroud)
从@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
Run Code Online (Sandbox Code Playgroud)