You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 17:47:54