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

R语言合并dataframe且不产生重复项的解决方案咨询

R语言重复键数据框合并方案

当两个待合并的数据框存在重复主键时,若直接使用常规合并逻辑会生成笛卡尔积,可通过给同主键分组内添加行序号、再按主键+行序号联合匹配的方式实现按顺序合并。

样例数据构造

# 对应重复键合并场景的测试数据
df1 <- data.frame(
  key = c("a", "a", "b", "c", "c", "c"),
  value1 = c(1, 2, 3, 4, 5, 6)
)

df2 <- data.frame(
  key = c("a", "a", "b", "b", "c"),
  value2 = c("x", "y", "m", "n", "p")
)

实现方法

方法1:基础R实现

无需额外安装依赖包:

# 为每个主键分组内的行添加顺序编号
df1$rowid <- ave(df1$key, df1$key, FUN = seq_along)
df2$rowid <- ave(df2$key, df2$key, FUN = seq_along)

# 按主键+行号联合合并
merge_res <- merge(df1, df2, by = c("key", "rowid"), all.x = TRUE)

# 删除临时生成的行号列
merge_res$rowid <- NULL

方法2:dplyr实现

代码更简洁,适合tidyverse生态用户:

library(dplyr)

merge_res <- df1 %>%
  group_by(key) %>%
  mutate(rowid = row_number()) %>%
  ungroup() %>%
  left_join(
    df2 %>%
      group_by(key) %>%
      mutate(rowid = row_number()) %>%
      ungroup(),
    by = c("key", "rowid")
  ) %>%
  select(-rowid)

两种方法最终都可以实现同主键分组内按行顺序匹配合并,避免生成无效的笛卡尔积结果,若某一数据框内的同主键行数更多,多出行对应的另一数据框字段会自动填充NA。


内容的提问来源于stack exchange,提问作者Katharina

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 15:36:03