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

如何基于多列值移除R数据框中指定重复记录?

R数据框记录筛选解决方案

问题说明

给定如下R数据框:

ID  Group   Chr
S1  Case    amt5:8
S2  Case    amt5:9
S3  FC      amt5:8
S4  PC      amt5:8
S5  FC      amt5:9
S6  Case    nhtf:56
S7  FC      nhtf:56
S8  Case    klju:78
S9  PC      klju:78
S28 Case    kljik:098
S67 PC      hyjfk
S34 FC      lkoj

需要移除所有满足以下两个条件的记录:

  • Group列值为"PC"
  • 该记录的Chr列值,在Group为"Case"或"FC"的记录的Chr列中存在重复

处理后的预期输出:

ID  Group   Chr
S2  Case    amt5:9
S5  FC      amt5:9
S6  Case    nhtf:56
S7  FC      nhtf:56
S28 Case    kljik:098
S67 PC      hyjfk
S34 FC      lkoj

数据框的dput结构:

structure(list(ID = c("S1", "S2", "S3", "S4", "S5", "S6", "S7", 
"S8", "S9", "S28", "S67", "S34"), Group = c("Case", "Case", "FC", 
"PC", "FC", "Case", "FC", "Case", "PC", "Case", "PC", "FC"), 
    Chr = c("amt5:8", "amt5:9", "amt5:8", "amt5:8", "amt5:9", 
    "nhtf:56", "nhtf:56", "klju:78", "klju:78", "kljik:098", 
    "hyjfk", "lkoj")), class = "data.frame", row.names = c(NA, 
-12L))

解决方案

方法1:Base R原生实现

无需额外安装包,直接通过索引筛选:

# 提取Case和FC组的所有唯一Chr值
chr_case_fc <- unique(df$Chr[df$Group %in% c("Case", "FC")])
# 筛选保留不符合删除条件的行
df_filtered <- df[!(df$Group == "PC" & df$Chr %in% chr_case_fc), ]
# 查看结果
print(df_filtered)

方法2:dplyr包(tidyverse风格)实现

如果日常使用tidyverse工具链,这种写法更直观易读:

library(dplyr)

df_filtered <- df %>%
  # 标记当前行Chr是否存在于Case/FC组中
  mutate(is_case_fc_chr = Chr %in% Chr[Group %in% c("Case", "FC")]) %>%
  # 移除Group为PC且Chr在Case/FC组中存在的行
  filter(!(Group == "PC" & is_case_fc_chr)) %>%
  # 删除临时标记列
  select(-is_case_fc_chr)

print(df_filtered)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 08:43:18