我需要合并两个数据帧x和y,它们有大约 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中的所有行?
谢谢。
您想要基于所有公共列进行合并。因此,首先您需要找出两个数据帧之间哪些列名称是通用的。
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)
我认为您拥有数据表而不是简单的数据框,并且两者之间的合并工作方式略有不同。您可以尝试强制它使用 dataframe 方法,NewDataframe <- merge.data.frame(x, y, all.x=TRUE)默认情况下应合并所有共享列名称。