在一个列表的列表中对数据框进行行绑定(rbind)。

30
我有一个列表的列表,形式如下:x[[state]][[year]]。其中每个元素都是一个数据框,单独访问它们并不成问题。
但是,我想跨多个列表合并数据框。更具体地说,我想要的输出与我拥有的年数相同,也就是在每个年份内将所有州的数据框合并。换句话说,我想将所有州的数据逐年合并到单独的数据框中。
我知道可以使用do.call("rbind", list)来将单个列表合并为数据框,但我不知道如何在列表的列表之间这样做。

2
出于好奇,你为什么要这样处理数据,而不是只有一个包含所有数据的大型数据框? - Jonathan Chang
3个回答

51

首先将其折叠成列表:

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

感谢您的及时帮助!但这并不是我想要的。您的答案给了我一个包含列表中所有数据框的单个数据框(使用unlist命令,这是我从未听说过的很酷的命令)。但我想要一个由32个rbind的数据框组成的列表,这正好是我拥有的年份数量,将所有州的数据合并在一起。您答案的第一行让我得到了一个大约为state * year长度的列表(尽管出于某种原因,我得到的长度为1584,而不是我期望的32 * 50 = 1600)。所以我认为这是一个线索... - bshor
经过更多的实验,我觉得我正在取得进展。我第一次为状态列表中的元素命名,因此现在未列出列表的元素(在Hadley的第一个命令之后)现在具有有用的名称,如“AL3”和“TX4”。现在我必须将所有的3组合在一起,所有的4组合在一起,依此类推。 - bshor
哦,我猜正则表达式是答案的一部分。我尝试使用grep("1$",names(list))来获取以“1”命名的列表,但这会让我得到所有年份中带有“1”的列表,比如11、21、31。我尝试了grep("\D1$",names(list)),但不行。 - bshor
你可以尝试使用reshape包中的melt函数 - 它会添加一些变量,使事情变得更容易。一旦你有了一个单独的数据框,就可以使用split函数将其分成所需的部分。 - hadley

12

你可以按照以下方式进行操作(由于我没有这样的结构,因此无法测试):

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)))   

函数“extract year”创建了一个列表,其中包含给定年份的数据帧。然后将它们按行合并...


2
事情变得有些复杂了,所以我尝试了你的方法,它起作用了!只需要稍微修改一下。第一行返回了我要找的数据框。第二行不起作用,所以我转而使用Hadley的plyr包。这个命令在你的第一行之后完美地返回了一个rbinded数据框列表:llply(my.list.of.years, function(my.year) do.call( rbind, extract.year(my.year)))太棒了,谢谢大家的帮助! - bshor
1
ldply() 更快更高效! - bshor

0

我意识到我来晚了,但是关于这个问题怎么样:

mymat <- do.call(rbind, lapply(mylist, function(element){
  element[[1]] # if df is the 1st entry of each list, could also access by name
}))
mydf <- as.data.frame(mymat)

它看起来与Marek的响应类似,但避免了sapply / lapply组合。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接