基于公共列合并数据帧,但保留 x 中的所有行

ded*_*ede 3 merge r dataframe

我需要合并两个数据帧xy,它们有大约 50 列公共列和一些唯一列,并且我需要保留x中的所有行。

如果我运行它会起作用:

 NewDataframe <- merge(x, y, by=c("ColumnA", "ColumnB", "ColumnC"),all.x=TRUE)
Run Code Online (Sandbox Code Playgroud)

问题是有超过 50 个公共列,我宁愿避免键入所有公共列的名称。

我尝试过:

 NewDataframe <- merge(x, y, all.x=TRUE)
Run Code Online (Sandbox Code Playgroud)

但出现以下错误:

 Error in merge.data.table(x, y, all.x = TRUE) :
 Elements listed in `by` must be valid column names in x and y
Run Code Online (Sandbox Code Playgroud)

有没有什么方法可以使用公共列而不输入所有列,但保留xby中的所有行?

谢谢。

zel*_*ite 7

您想要基于所有公共列进行合并。因此,首先您需要找出两个数据帧之间哪些列名称是通用的。

common_col_names <- intersect(names(x), names(y))
Run Code Online (Sandbox Code Playgroud)

然后,您使用该字符向量作为by合并函数中的参数。

merge(x, y, by=common_col_names, all.x=TRUE)
Run Code Online (Sandbox Code Playgroud)

编辑:阅读@Andrew Gustar的答案后,我仔细检查了合并函数的文档,这正是默认by参数:

## S3 method for class 'data.frame'
merge(x, y, by = intersect(names(x), names(y)), # <-- Look here
      by.x = by, by.y = by, all = FALSE, all.x = all, all.y = all,
      sort = TRUE, suffixes = c(".x",".y"),
      incomparables = NULL, ...)
Run Code Online (Sandbox Code Playgroud)


And*_*tar 6

我认为您拥有数据表而不是简单的数据框,并且两者之间的合并工作方式略有不同。您可以尝试强制它使用 dataframe 方法,NewDataframe <- merge.data.frame(x, y, all.x=TRUE)默认情况下应合并所有共享列名称。