【问题标题】:How do I merge all data frames in the global environment?如何合并全局环境中的所有数据框?
【发布时间】:2016-04-19 17:08:23
【问题描述】:

我在全球环境中有几十个数据框。我想在不输入所有名称的情况下合并所有这些。

我该怎么做?

【问题讨论】:

  • DF_list = ls() ; merged_DF = Reduce(function(x, y) merge(x, y, by= common_variable), DF_list ) ,您可以使用 ls() 列出所有数据集并指定这些数据集之间的公共变量
  • 水平合并(merge())还是垂直合并(rbind())?您的全局环境中是否还有其他对象?基本成分是ls() + get() + (rbind() or merge()) + (do.call() or Reduce) ...
  • @BenBolker 水平合并
  • 听起来问题开始于您在全局环境中创建数十个数据框时

标签: r merge


【解决方案1】:

遵循@Osssan 的 cmets,并假设您要合并全局工作区中的所有内容

获取对象的名称,然后将对象本身检索到列表中:

DF_obj <- lapply(ls(), get)

如果您想合并所有常见变量(例如,如果所有变量名都是唯一的,除了您要合并的变量),那么只需

Reduce(merge, DF_obj)

应该可以。

不幸的是(与lapply() 等不同)Reduce 没有用于将其他命名参数传递给函数的... 参数,因此Reduce(merge, DF_obj, by=common_variable) 不起作用;正如@Osssan 指出的那样,您需要类似的东西

mergefun <- function(x, y) merge(x, y, by= "common_variable")
merged_DF <- Reduce(mergefun, DF_obj )

正如其他评论者指出的那样,如果您首先将数据框保存在列表中,则可以省去 ls()/get() 步骤,这通常是笨重/脆弱的(如果您想从函数传回对象?如果您只想合并工作区中的一些对象怎么办?...)

【讨论】:

  • 嗯,我确实有一个所有数据框名称的列表。
  • 我也运行了这段代码:dfObj &lt;- lapply(ls(), get), mergeFunc &lt;- function(x,y) merge(x, y, by=rank), mergedDF &lt;- Reduce(mergeFunc, dfObj),其中逗号是换行符,但我得到了这个错误:Error in as.vector(x, mode) : cannot coerce type 'closure' to vector of type 'any'
  • 您的合并变量名称需要用引号引起来:by="rank"
猜你喜欢
  • 1970-01-01
  • 2021-08-16
  • 1970-01-01
  • 2014-05-19
  • 2014-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-22
相关资源
最近更新 更多