如何基于多列值移除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
相关产品推荐
相关产品推荐

