为何使用merge合并DataFrame后返回行数超出预期?
问题原因
你得到的结果是merge()默认行为导致的笛卡尔积。当指定by="id"时,merge()会把x中所有id相同的行,和y中所有id相同的行逐一配对组合——比如id=1在x里有3行,y里也有3行,就会生成3×3=9行配对结果,三个id组加起来就是27行,这是内连接的标准逻辑:只要id匹配就合并,不考虑行的顺序或位置。
解决方案
你需要的是同id组内按行位置对应合并,也就是x里id组的第1行对应y里同id组的第1行,以此类推。下面是几种可行方法:
方法1:添加分组序号后合并
给两个数据框各加一个同id组内的行号,然后按id和行号一起合并:
x$row_num <- ave(x$id, x$id, FUN = seq_along) y$row_num <- ave(y$id, y$id, FUN = seq_along) z <- merge(x, y, by = c("id", "row_num")) # 可选:删除额外的row_num列 z <- z[, !names(z) %in% "row_num"]
方法2:直接按行合并(适用于行数、id顺序完全一致的情况)
如果x和y的总行数相同,且每行的id一一对应,直接用cbind更高效:
z <- cbind(x, vr2 = y$vr2)
或者用dplyr的bind_cols:
library(dplyr) z <- bind_cols(x, select(y, vr2))
方法3:dplyr分组匹配(更直观)
用dplyr按id分组后,直接对应赋值vr2:
library(dplyr) z <- x %>% group_by(id) %>% mutate(vr2 = y$vr2[cur_group_rows()]) %>% ungroup()
以上方法都能得到你预期的9行结果。
内容的提问来源于stack exchange,提问作者iGada
相关产品推荐
相关产品推荐

