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

R语言:按抗体规则对含重复ID的DataFrame去重并保留原始行

解决DataFrame按ID去重并保留对应原始行的问题

我明白你的核心需求:给带有重复ID的DataFrame去重,每个ID仅保留一行,且必须保证只要患者有过阳性抗体结果,就保留一条原始的阳性行(带对应的AA、BB值);全阴性则保留一条原始阴性行。之前的group_by + summarise方法确实存在风险——它会把组内第一行的AA/BB值和手动设定的抗体状态强行绑定,完全忽略了状态与对应行的关联逻辑。

这里给你一个更可靠的解决方案,用dplyr就能实现,全程保留原始行的所有数据:

library(dplyr)

# 按规则去重,完整保留原始行数据
df_cleaned <- df %>%
  group_by(ID) %>%
  # 先筛选符合条件的行:有阳性则留所有阳性行,全阴性则留所有阴性行
  filter(if (any(antibodies == "positive")) antibodies == "positive" else antibodies == "negative") %>%
  # 从筛选后的行中随机抽取1条
  slice_sample(n = 1) %>%
  # 取消分组,恢复常规DataFrame结构
  ungroup()

代码逻辑拆解:

  • group_by(ID):将数据按患者ID分组,每个组对应同一个患者的所有检测记录
  • filter(...):对每个组做针对性筛选:
    • 如果组内存在至少一条阳性结果(any(antibodies == "positive")),就只保留组内所有阳性行
    • 如果组内全是阴性结果,就保留所有阴性行
  • slice_sample(n = 1):在筛选后的行里随机抽取1条,确保选中的是完全原始的行,AA、BB值与抗体状态完全匹配
  • ungroup():取消分组,让结果回到常规的DataFrame格式

对比原方法的优势:

原方法用summarise手动赋值抗体状态,再取first(AA),本质是把"抗体状态"和"组内第一行的AA/BB"强行绑定,完全不考虑状态对应的原始行。而这个方法是先筛选出符合状态要求的原始行,再随机选一条,从根源上避免了状态与其他列不匹配的问题。

比如用你提供的示例数据测试,ID3的筛选结果是前两条阳性行,slice_sample会随机选中其中一条,保留对应的AA(567或568)和BB(786或45645),绝对不会出现"阳性状态搭配阴性行AA/BB"的错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 18:02:28