我有一个包含许多要合并的数据.框架的列表。这里的问题是,每个数据.框架的行数和列数都不同,但它们都共享关键变量(我在下面的代码中将其称为"var1"
和"var2"
)。如果 Dataframe 在列方面是相同的,我可以只使用rbind
,plyr的rbind.fill可以完成这项工作,但这些数据的情况并非如此。
因为merge
命令只对2个 Dataframe 有效,所以我求助于互联网,我从here那里得到了这个命令,它在R 2.7.2中运行得很好,这就是我当时所拥有的:
merge.rec <- function(.list, ...){
if(length(.list)==1) return(.list[[1]])
Recall(c(list(merge(.list[[1]], .list[[2]], ...)), .list[-(1:2)]), ...)
}
我会这样调用这个函数:
df <- merge.rec(my.list, by.x = c("var1", "var2"),
by.y = c("var1", "var2"), all = T, suffixes=c("", ""))
但在2.7.2之后的任何R版本(包括2.11和2.12)中,此代码将失败,并出现以下错误:
Error in match.names(clabs, names(xi)) :
names do not match previous names
(偶然地,我看到其他参考这个错误elsewhere没有解决)。
有什么办法解决这个问题吗?
9条答案
按热度按时间xnifntxz1#
另一个问题专门问how to perform multiple left joins using dplyr in R。这个问题被标记为这个问题的重复,所以我在这里回答,使用下面的3个样本 Dataframe :
答案分为三个部分,分别代表执行合并的三种不同方式。如果您已经在使用tidyverse包,您可能希望使用
purrr
方式。为了便于比较,您将在下面找到使用相同示例数据集的基本R版本。1)将它们与
purrr
软件包中的reduce
连接在一起:purrr
包提供了一个reduce
函数,该函数具有简洁的语法:您也可以执行其他链接,例如
full_join
或inner_join
:2)
dplyr::left_join()
,以R为底数Reduce()
:3)底座R
merge()
与底座RReduce()
:为了便于比较,这里是一个基于R的左连接,它基于Charles的答案。
8wtpewkr2#
Reduce使此操作变得相当简单:
下面是一个使用一些模拟数据的完整示例:
下面是一个使用these data复制
my.list
的示例:注意:看起来这可能是
merge
中的一个bug。问题是没有检查添加后缀(以处理重叠的不匹配名称)实际上是否使它们唯一。在某个点上,它使用[.data.frame
,这 * 会 *make.unique
名称,导致rbind
失败。最简单的修复方法是不要将重复字段(此处有许多重复字段)的字段重命名保留到
merge
。例如:merge
/Reduce
将正常工作。ia2d9nvy3#
您可以使用
reshape
包中的merge_all
来完成此操作。Here is an excellent resource on different methods to merge data frames。
5uzkadbs4#
你可以使用递归来完成这个任务。我还没有验证下面的内容,但是它应该会给予你一个正确的想法:
deyfvvtc5#
我们可以使用{powerjoin}。
从已接受的答案中借用示例数据:
也可以从 Dataframe 开始,然后连接 Dataframe 列表,以获得相同的结果
vhmi4jdf6#
我将重用来自@PaulRougieux的数据示例
下面是一个使用
purrr
和tidyr
的简洁的解决方案56lgkhnf7#
我有一个没有公共id列的 Dataframe 列表。
我在许多DFS上丢失了数据。有空值。 Dataframe 是用表函数产生的。Reduce,Merging,rbind,rbind.fill,以及它们的类似函数不能帮助我达到我的目标。我的目标是产生一个可理解的合并 Dataframe ,与丢失的数据和公共id列无关。
因此,我做了下面的函数。也许这个函数可以帮助别人。
它遵循的功能
运行示例
pbwdgjma8#
如果您有一个DFS列表,并且某个列包含“ID”,但在某些列表中,某些ID丢失,则可以使用此版本的“减少/合并”来连接丢失行ID或标签的多个DFS:
yzxexxkh9#
这里是一个通用的 Package 器,它可以用来将一个二进制函数转换成多参数函数。这个解决方案的好处是它非常通用,可以应用于任何二进制函数。你只需要做一次,然后你可以在任何地方应用它。
为了演示这个想法,我使用简单的递归来实现。当然,它可以用更优雅的方式来实现,这得益于R对函数式范例的良好支持。
然后,您可以简单地用它 Package 任何二进制函数,并使用第一个括号中的位置参数(通常是data.frames)和第二个括号中的命名参数(例如
by =
或suffix =
)调用。如果没有命名参数,请将第二个括号留空。