【问题标题】:rbind dataframes in a list of listsrbind 列表列表中的数据帧
【发布时间】:2010-12-11 18:31:10
【问题描述】:

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

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

我知道我可以使用do.call("rbind",list) 将单个列表组合成一个数据框。但我不知道如何在列表列表中做到这一点。

【问题讨论】:

  • 出于好奇,您为什么要以这种方式处理数据,而不是一个包含所有数据的大型数据框?

标签: list r dataframe


【解决方案1】:

您可以按照以下方式做一些事情(我无法测试,因为我没有这样的结构):

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

函数提取年份创建一个列表,其中仅包含给定年份的数据框。然后你 rbind 他们...

【讨论】:

  • 上面的答案让事情变得复杂了,所以我尝试了你的方法,它奏效了!稍加修改。第一行返回了我正在寻找的数据框。第二行没有用,所以我转而使用 Hadley 的 plyr 包。此命令在您的第一行之后完美地返回一个 rbinded 数据帧列表: llply(my.list.of.years, function(my.year) do.call( rbind, extract.year(my.year))) 太棒了,谢谢大家为了帮助!
  • ldply() 更快更高效!
【解决方案2】:

先把它折叠成一个列表:

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

【讨论】:

  • 感谢您的及时帮助!但这并不是我想要的。您的回答给了我列表列表中所有数据框的 SINGLE 数据框(使用 unlist,一个我从来不知道的很酷的命令)。但我想要一个包含 32 个 rbind 数据帧的列表,这些数据帧与我的年数一样多,将所有状态组合在一起。你的答案的第一行给了我一个大约州*年长度的列表(尽管由于某种原因我得到长度 = 1584,而不是我期望的 32*50=1600)。所以我认为这是一个线索......
  • 经过更多的实验,我想我已经到了某个地方。我第一次命名状态列表的元素,所以现在未列出列表的元素(在 Hadley 的第一个命令之后)现在有了有用的名称,如“AL3”和“TX4”。现在我必须将所有 3 和所有 4 组合在一起,等等。
  • 哦,男孩,我想正则表达式是答案的一部分。我尝试使用 grep("1$",names(list)) 来获取以“1”命名的列表,但这让我多年来都在其中使用 1,例如 11、21、31。我尝试了 grep( "\D1$",names(list)) 但不行。
  • 您可以尝试使用 reshape 包中的melt - 它会添加变量,让事情变得更容易。如果您有一个数据框,请使用 split 将其分解为您想要的部分。
猜你喜欢
  • 1970-01-01
  • 2017-05-26
  • 2013-05-08
  • 1970-01-01
  • 1970-01-01
  • 2015-01-22
  • 1970-01-01
  • 2018-06-21
  • 2021-08-21
相关资源
最近更新 更多