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

技术求助:如何按主键合并含重复项的数据框且仅单次匹配关联值

解决重复id合并时仅保留首次匹配值的问题

这个需求我太懂了!默认的left_join会把匹配到的Value重复填充给每个同id的行,要实现每个id仅在第一行显示对应Value,其余行留空,用dplyr就能轻松搞定,不用换其他工具。

解决方案代码

library(dplyr)

# 你的原始数据框
ds1 <- data.frame( id = c(1,1,1,2,2), V2 = c(5,6,7,5,8) )
ds2 <- data.frame( id=c(1,2), Value=c(56,98) )

# 核心操作:左连接后按id分组,仅保留每组第一行的Value
ds_result <- ds1 %>%
  left_join(ds2, by = "id") %>%
  group_by(id) %>%
  mutate(Value = ifelse(row_number() == 1, Value, NA)) %>%
  ungroup()

# 查看结果
print(ds_result)

输出结果

# A tibble: 5 × 3
     id    V2 Value
  <dbl> <dbl> <dbl>
1     1     5    56
2     1     6    NA
3     1     7    NA
4     2     5    98
5     2     8    NA

代码解释

  1. 先执行left_join完成基础合并,得到和你之前一样的重复填充结果;
  2. group_by(id)把相同id的行归为一组;
  3. row_number()给每组内的行按原始顺序编号,用ifelse判断:只有编号为1的行保留原始Value,其余行替换为NA;
  4. ungroup()取消分组,避免后续操作受分组状态影响。

可选调整:把NA换成空白字符

如果你希望空值显示为空白而非NA,可以修改mutate语句(注意这会把Value列转为字符型):

mutate(Value = ifelse(row_number() == 1, as.character(Value), ""))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:58:37