2009-10-30 32 views
18

我有一个如下所示的列表清单:x[[state]][[year]]。每个元素都是一个数据框,并且单独访问它们不是问题。rbind列表中的数据帧

但是,我想要跨多个列表绑定数据帧。更具体地说,我希望拥有与我有多年的数据帧一样多的输出,即每年都要绑定所有状态数据帧。换句话说,我想将我所有的状态数据逐年整合到单独的数据框中。

我知道我可以将单个列表合并到一个数据框中,其中包含do.call("rbind",list)。但我不知道如何在列表清单上做到这一点。

+2

出于好奇,为什么你处理数据这种方式,而不是仅仅具有所有数据的一个大的数据帧? –

回答

6

你可以沿着以下行的东西(我无法测试,因为我没有这样的结构):

extract.year <- function(my.year) lapply(x, function(y) y[[my.year]]) 

x.by.year <- sapply(my.list.of.years, function(my.year) 
    do.call(rbind, extract.year(my.year))) 

函数摘录年创建只包含给定年份的dataframes列表。然后你rbind他们...

+2

事情变得越来越复杂,所以我尝试了你的方法,它的工作!稍作修改。第一行返回了我正在查找的数据框。第二行不起作用,所以我转向了哈德利的plyr软件包。此命令在您的第一行后返回完整的数据帧清单: llply(my.list.of.years,function(my.year)do.call(rbind,extract.year(my.year))) 太棒了,谢谢你们的帮助! – bshor

+1

ldply()更快,更高效! – bshor

32

折叠成一个列表第一:

list <- unlist(listoflists, recursive = FALSE) 
df <- do.call("rbind", list) 
+0

感谢您的及时帮助!但这不完全是我想要的。你的回答给了我列表中所有数据帧的单一数据帧(使用unlist,一个我从来不知道的酷炫命令)。但是,我想要一份32页的数据框架列表,这些框架和我一样多年,将所有州合并在一起。 你的答案的第一行给我一个大约州*年的长度列表(尽管由于某种原因,我得到的长度= 1584,而不是32 * 50 = 1600,如我所料)。所以我认为这是一个线索... – bshor

+0

经过一些更多的实验后,我想我正在某个地方。我首次列出了州列表的元素,所以现在列表中的元素(哈德利的第一个命令之后)现在具有有用的名称,如“AL3”和“TX4”。现在我必须将所有3个结合在一起,所有4个结合在一起,等等。 – bshor

+0

哦,男孩,我猜正则表达式是答案的一部分。我尝试了grep(“1 $”,names(list))来获取以“1”命名的列表,但这些列表让我在这些列表中以1,21,21,31等多年。我尝试了grep( “\ D1 $”,名称(列表)),但没有去。 – bshor