如何移除含Undetermined值的自定义重复样本组?(R语言)
移除含Undetermined值的重复组数据筛选方案
问题背景
有一个包含10万+观测、38个变量的数据框,记录不同数据源同一样本的多组观测(共6个标记):
- 重复组定义:
data_source、sample_name和marker取值完全相同的行集合 - 筛选需求:在
end<10、status="good"、intensity!="Undetermined"的基础上,彻底移除所有组内存在intensity="Undetermined"的重复组(即只要组内有一行是Undetermined,整组所有行都删除)
示例数据:
df1 <- data.frame(data_source = c("1", "1", "1", "1", "1","1", "1" , "1", "1", "1", "1","1", "2", "2", "2", "2", "2", "2", "2", "2", "2", "2", "2", "2"), sample_name = c("x1", "x1", "x1","x1", "x1", "x1", "x1", "x1", "x1", "x1", "x1", "x1", "x1", "x1", "x1","x1", "x1", "x1", "x1", "x1", "x1", "x1", "x1", "x1"), marker = c("A", "B", "C","D", "E", "F", "A", "B", "C", "D", "E", "F", "A", "B", "C","D", "E", "F", "A", "B", "C", "D", "E", "F"), intensity = c(9.74, 12.54, 15.32, 13.01, 15.83, 20.74, "Undetermined", 13.64, 15.13, 13.56, 15.72, 20.99, 13.63, 15.62, "Undetermined", 16.15, 20.15, 17.55, 13.14, 16.01, 10.52, 17.00, 19.89, 18.21), end = c(9, 9, 9, 8, 8, 8, 9, 8, 8, 7, 9, 8, 9, 9, 9, 8, 8, 8, 9, 8, 8, 7, 9, 8), status = c("good", "good", "good", "good", "good", "good", "good", "good", "good", "good", "good", "good", "good", "good", "good", "good", "good", "good", "good", "good", "good", "good", "good", "good")) print(df1)
解决方案
方案1:Base R 原生实现(无需额外包)
通过分组标记+条件过滤完成,适合不想加载第三方包的场景:
# 给每个重复组标记是否存在Undetermined值 df1$bad_group <- ave(df1$intensity == "Undetermined", df1$data_source, df1$sample_name, df1$marker, FUN = any) # 叠加所有筛选条件,过滤目标数据 df2 <- df1[df1$end < 10 & df1$status == "good" & df1$intensity != "Undetermined" & !df1$bad_group, ] # 清理临时标记列 df2$bad_group <- NULL
方案2:dplyr 管道实现(简洁高效,适合大数据量)
用dplyr的分组处理逻辑,代码可读性更强,处理10万+行数据效率优异:
library(dplyr) df2 <- df1 %>% # 按重复组定义分组,标记组内是否有Undetermined group_by(data_source, sample_name, marker) %>% mutate(bad_group = any(intensity == "Undetermined")) %>% ungroup() %>% # 应用所有筛选规则 filter(end < 10, status == "good", intensity != "Undetermined", !bad_group) %>% # 删除临时标记列 select(-bad_group)
说明
两种方案都能精准过滤掉所有包含Undetermined值的重复组,同时保留符合原有条件的有效数据。dplyr方案代码更简洁易维护,Base R方案无需依赖第三方包,可根据自身环境选择。
内容的提问来源于stack exchange,提问作者Joel Blomqvist
相关产品推荐
相关产品推荐

