2016-10-05 43 views
1

我看到类似的问题在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 

到这样一个数据帧:

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

我试图用在reshape2melt,我有时间和int作为一列中的值(L2)。事情是这样的:

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

回答

5

您可以使用ldplyplyr

从@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 
+1

看来ldply适用于我的数据集。我没有错误标记时间和整数对。 –

4

rbindlistdata.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 
+0

感谢您的帮助。但通过这种方式,我在数据框中以列的形式丢失了​​第一级列表名称信息。例如,我的“a”和“b”消失了,我不知道哪一次是a或b。 –

+0

@juanwang - 'rbindlist(lst,idcol =“id”)' - 有一个'idcol'参数可以解决这个问题。 – thelatemail

+0

解决了这个问题。非常感谢。 –