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

时间:2017-04-19 15:14:17

标签: r dataframe merge

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

如果我跑:

 NewDataframe <- merge(x, y, by=c("ColumnA", "ColumnB", "ColumnC"),all.x=TRUE)

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

我尝试过:

 NewDataframe <- merge(x, y, all.x=TRUE)

但出现以下错误:

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

有没有办法将by与公共列一起使用而不键入所有列,但保留 x 中的所有行?

谢谢。

3 个答案:

答案 0 :(得分:3)

您希望基于所有常用列进行合并。首先,您需要找出两个数据帧之间通用的列名称。

common_col_names <- intersect(names(x), names(y))

然后在合并函数中使用此字符向量作为by参数。

merge(x, y, by=common_col_names, all.x=TRUE)

编辑:在阅读了@Andrew Gustar的answer之后,我仔细检查了合并函数的文档,这正是默认的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, ...)

答案 1 :(得分:1)

我认为你有数据表而不是简单的数据帧,并且两者之间的合并工作略有不同。您可以尝试使用NewDataframe <- merge.data.frame(x, y, all.x=TRUE)强制它使用数据框方法,Name[] applicants = new Name[4]; applicants[0] = new Name("john", "bob", "rush"); applicants[1] = new Name("joe", "bob", "rushden"); applicants[2] = new Name("jack", "bob", "rushden"); applicants[3] = new Name("jake", "bob", "rushden"); Optional<Name> result = Arrays.stream(applicants) .filter(name -> name.middlename.equals("bob") && name.surname.equals("rush")) .findAny(); result.ifPresent(name -> System.out.println(name)); 默认情况下应合并所有共享列名。

答案 2 :(得分:0)

来自left_join的{​​{1}}功能可以准确地为您提供所需内容。

首先创建一些虚拟数据......

dplyr

然后运行加入...

shared <- tibble(a=rnorm(327), b=rnorm(327),c=rnorm(327),d=rnorm(327),e=rnorm(327),f=rnorm(327),g=rnorm(327))
x <- cbind(shared, tibble(v =rnorm(327),w=rnorm(327),x=rnorm(327),y=rnorm(327),z=rnorm(327)))
y <- cbind(shared, tibble(h =rnorm(327),i=rnorm(327),j=rnorm(327),k=rnorm(327),l=rnorm(327)))
rm(shared)

如您所见,该函数计算出两者之间共享的列,并在连接中自动使用它们。