我需要合并两个数据帧 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 中的所有行?
谢谢。
答案 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)
如您所见,该函数计算出两者之间共享的列,并在连接中自动使用它们。