【问题标题】:Can I combine a list of similar dataframes into a single dataframe? [duplicate]我可以将类似数据框的列表组合成一个数据框吗? [复制]
【发布时间】:2011-07-08 10:49:17
【问题描述】:

我有一个数据框:

foo <- list(df1 = data.frame(x=c('a', 'b', 'c'),y = c(1,2,3)), 
            df2 = data.frame(x=c('d', 'e', 'f'),y = c(4,5,6)))

我可以将其转换为表单的单个数据框吗:

data.frame(x = c('a', 'b', 'c', 'd', 'e', 'f'), y= c(1,2,3,4,5,6))

?

【问题讨论】:

  • 相关:stackoverflow.com/questions/4748537/…stackoverflow.com/questions/2392915/…stackoverflow.com/questions/2851327/… ... 请在提问之前进行搜索:如果我能记住至少 2 个与 appx 同名的问题,你没有没有做任何努力,是吗?
  • @Joris,感谢您指出这些,但您的记忆功能比我的查询 + SO 搜索引擎更好:这些答案都没有出现在 "[r] +list +dataframe 的 89 个结果中" 或我搜索的前 100 条记录,包括 "[r] convert list to dataframe" 和 "[r] combine list to dataframe"。我会很感激能找到这些结果的搜索建议。
  • 与 [r] 结合数据框,您至少可以在第一页上获得一个相关问题。使用 [r] 组合列表数据框,您可以将其作为第二个答案。我同意当你把数据框写成一个词时,它会变得很棘手。很抱歉我之前评论的语气很严厉。
  • 附注:最好将这些词分开,因为很多人将它们写成数据框(搜索引擎识别为 2 个词)。

标签: list r dataframe


【解决方案1】:

do.call("rbind", foo) 应该可以解决问题。

【讨论】:

  • 一个更有效的解决方案是来自 data.table 的rbindlist。查看this post 了解详细信息和基准测试。
  • rbind_list 现已弃用,您应该改用 dplyr::bind_rows
【解决方案2】:

plyr:

foo <- list(df1 = data.frame(x=c('a', 'b', 'c'),y = c(1,2,3)), 
        df2 = data.frame(x=c('d', 'e', 'f'),y = c(4,5,6)))

library(plyr)
ldply(foo)[,-1]
  x y
1 a 1
2 b 2
3 c 3
4 d 4
5 e 5
6 f 6

【讨论】:

  • 还有rbind.fill in plyr,与do.call("rbind", list) 类似,但允许列名不匹配。
【解决方案3】:

您的代码有几个问题。

首先是列表中的赋值语句不起作用。这需要通过以下方式解决,例如:

foo <- list(
        df1 = data.frame(x=c('a', 'b', 'c'), y = c(1,2,3)), 
        df2 = data.frame(x=c('d', 'e', 'f'), y = c(4,5,6))
)

然后您可以使用 rbind() 来组合数据帧:

rbind(foo$df1, foo$df2)

  x y
1 a 1
2 b 2
3 c 3
4 d 4
5 e 5
6 f 6

但这提出了更多问题。例如,您为什么首先将数据框组合在列表中。第二个是你是否真的需要使用数据帧而不是向量。最后,我通常尽量避免使用 rbind(),而在以这种方式组合数据帧时使用 merge()。

【讨论】:

  • 感谢您指出我的代码中的错误。我已经修好了。也感谢您的回答 - 我没有意识到它是如此简单。实际数据框要大得多,我的工作流程经常使用lapply,这里我只想绑定数据框,让xtable成为一个表。,
  • @David,现在说得通了。如果你经常使用 lapply,你可能还想看看 plyr 中的函数,它为这类问题提供了一个通用的框架。那么解决方案就变成了 ldply(foo, rbind)
【解决方案4】:

merge(foo[[1]], foo[[2]], all = TRUE)怎么样

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-24
    • 2016-12-23
    • 1970-01-01
    • 2015-08-26
    • 2018-08-12
    • 2020-06-29
    相关资源
    最近更新 更多