按列名合并3个 Dataframe

1cklez4t  于 2023-10-13  发布在  其他
关注(0)|答案(5)|浏览(139)

我有三个独立的data.frames。这三个data.frames具有相同的列数和行数。此外,它们具有相同的列名。我正试图根据列名合并三个 Dataframe 。我使用下面的代码来合并两个data.frames并返回匹配的数量。

Merged_DF = sapply(names(DF1),function(n) nrow(merge(DF1, DF2, by=n)))

问题是,虽然在这个例子中有两个data.frames,但在我的例子中,我有3个data.frames。如何修改代码以合并三个 Dataframe 而不是两个?我尝试以这种方式修改字符串,只是添加第三个data.frame,但它不起作用:

Merged_DF = sapply(names(DF1),function(n) nrow(merge(DF1, DF2, DF3,  by=n)))

它返回以下错误:

Error in fix.by(by.x, x) :  'by' must specify column(s) as numbers, names or logical

例如:
DF1

G1  G2  G3
  a   b   f
  b   c   a
  c   d   b

DF2

G1  G2  G3
  A   b   f
  b   c   a
  h   M   b

DF3

G1  G2  G3
  a   b   f
  b   l   a
  j   M   v

data.frames大约有250行和50行。

izkcnapc

izkcnapc1#

您可以使用Reduce函数合并多个 Dataframe :

df_list <- list(DF1, DF2, DF3)
Reduce(function(x, y) merge(x, y, all=TRUE), df_list, accumulate=FALSE)

或者reshape包中的merge_recurse

library(reshape)
data <- merge_recurse(df_list)

参见R Wiki:Merge data frames

eivnm1vs

eivnm1vs2#

今天,在研究了几个小时的这个问题之后,我想出了这个简单而优雅的解决方案,使用了'duberr'管道和基本的R 'merge()'函数的组合。

MergedDF <- merge(DF1, DF2) %>%
              merge(DF3)

正如您在文章中提到的,这假设列名相同,并且合并的每个数据框中的行数相同。这还将自动消除合并过程中使用的任何重复列(即标识符)。

ki1q1bka

ki1q1bka3#

如果有人想合并多个列名相同但行号不相等的数据框,这篇文章很有帮助:https://medium.com/coinmonks/merging-multiple-dataframes-in-r-72629c4632a3
基本上,你可以使用do.call和rbind函数:

Merged <- do.call("rbind", list(df1, df2, df3, df4))
kuarbcqp

kuarbcqp4#

我通常使用来自dqr的bind_rows

library(dplyr)

bind_rows(df1, df2  ,df3 )

注意事项和选项在文档中
https://dplyr.tidyverse.org/reference/bind.html
happy merging:)

2uluyalo

2uluyalo5#

下面是一个使用tidyverse包的选项:

library(purrr)
library(dplyr)

reduce(list(DF1, DF2, DF3), full_join)

默认情况下,这将合并所有公共列。要获得更多控制,您可以指定一个匿名公式函数,其中.x表示累积值,.y表示“下一个”值。与上述类似的表达式为:

reduce(list(DF1, DF2, DF3), ~ full_join(.x, .y, by = c("G1", "G2", "G3")))

相关问题