将列表转换为R中的数据帧

时间:2014-02-15 16:47:24

标签: r dataframe

我有不同列表长度的数据列表:

[[1]]
[1] "2009" "2010" "2011" "2012"

[[2]]
[1] "2010" "2011" "2012" "2013"

[[3]]
[1] "2008" "2009" "2010" "2011" "2012"

[[4]]
[1] "2011" "2012"

我想得到一个像这样的列data.frame:

2009
2010
2011
2012
2010
2011
....

我继续这样做不成功:

# transpose list of years  
YearsDf <- lapply(GetYears, data.frame)

删除colnames(因为数据帧列表给出了一些奇怪的列名):

YearsOk <- lapply(YearsDf, function(x) "colnames<-"(x, NULL))

这一切都来自:

 [[1]]
   NA
1 2009
2 2010
3 2011
4 2012

 [[2]]
   NA
1 2010
2 2011
3 2012
4 2013

......

现在只需绑定并获取data.frame。这给了NA的

ldply(YearsOk, data.frame)

我如何访问一列的data.frame?

2 个答案:

答案 0 :(得分:2)

您考虑过unlist吗?

myL <- list(as.character(2009:2012), 
            as.character(2010:2011), 
            as.character(2009:2014))
data.frame(year = unlist(myL))
#    year
# 1  2009
# 2  2010
# 3  2011
# 4  2012
# 5  2010
# 6  2011
# 7  2009
# 8  2010
# 9  2011
# 10 2012
# 11 2013
# 12 2014

如果您认为保留值来自哪个列表元素非常重要,请考虑“{1}}(需要命名列表)或”reshape2“包中的stack

melt

最后,这绝对不是我将采取的方法,但根据您的示例代码,也许您正在尝试执行以下操作:

library(reshape2)
melt(myL)
#    value L1
# 1   2009  1
# 2   2010  1
# ...SNIP...
# 11  2013  3
# 12  2014  3

## stack requires names, so add some in...
stack(setNames(myL, seq_along(myL)))
#    values ind
# 1    2009   1
# 2    2010   1
# ...SNIP...
# 12   2014   3

答案 1 :(得分:0)

这很简单。这个答案有不同的长度

Q<-list(a=a,b=b)
str(Q)
List of 2
 $ a: int [1:11] 1 2 3 4 5 6 7 8 9 10 ...
 $ b: int [1:29] 2 3 4 5 6 7 8 9 10 11 ...
Q$a
 [1]  1  2  3  4  5  6  7  8  9 10 11
T<-c(Q$a,Q$b)
T
 [1]  1  2  3  4  5  6  7  8  9 10 11  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17
[28] 18 19 20 21 22 23 24 25 26 27 28 29 30
TT<-data.frame(T)
TT
    T
1   1
2   2
3   3
4   4
5   5
6   6
7   7
8   8
9   9
10 10
11 11
12  2
13  3
14  4
15  5
16  6
17  7
18  8
19  9
20 10
21 11
22 12
23 13
24 14
25 15
26 16
27 17
28 18
29 19
30 20
31 21
32 22
33 23
34 24
35 25
36 26
37 27
38 28
39 29
40 30