R语言:基于两列条件筛选/移除聚类组的技术问询
问题描述
现有数据集df,其中Cluster代表聚类分组,ID是个体标识,Target标记是否为目标个体(Yes/No),Used标记个体是否被使用(Yes/No)。原始数据集如下:
Cluster ID Target Used 1 1 Yes Yes 1 2 No No 1 3 No Yes 2 1 No No 2 2 Yes No 2 3 No Yes 2 4 No Yes
需求:筛选数据集,保留所有包含Target=Yes且Used=Yes的聚类,移除其余聚类(注:原描述存在笔误,根据预期结果修正)。预期结果仅保留Cluster 1的所有行:
Cluster ID Target Used 1 1 Yes Yes 1 2 No No 1 3 No Yes
尝试用dplyr写的代码只返回了Target=Yes的行,没法完整保留整个聚类,代码如下:
grouped_df <- df %>% group_by(Cluster) grouped_df %>% filter(all(yes %in% Used) & all(yes %in% Target)) %>% distinct(Cluster)
需要一段能完整保留聚类,根据聚类中是否存在被使用的目标个体来选择/移除整个聚类的代码。
解决方案
用dplyr就能轻松解决,核心逻辑是按聚类分组后,判断组内是否存在符合Target=Yes且Used=Yes的行,留下符合条件的整个聚类即可。
直接上可用代码:
library(dplyr) filtered_df <- df %>% group_by(Cluster) %>% filter(any(Target == "Yes" & Used == "Yes")) %>% ungroup()
代码说明
group_by(Cluster):把数据按聚类分组,后续判断都针对每个聚类单独执行filter(any(Target == "Yes" & Used == "Yes")):检查当前聚类里有没有至少一行满足“是目标个体且被使用”,有的话就保留这个聚类的所有行ungroup():取消分组,恢复成普通的数据框格式
结果验证
运行代码后,输出完全符合预期:
Cluster ID Target Used <int> <int> <chr> <chr> 1 1 1 Yes Yes 2 1 2 No No 3 1 3 No Yes
如果你的实际需求是移除包含被使用的目标个体的聚类(即保留Cluster 2),只需在any前加个取反符号!:
filtered_df <- df %>% group_by(Cluster) %>% filter(!any(Target == "Yes" & Used == "Yes")) %>% ungroup()
内容的提问来源于stack exchange,提问作者Teresa
相关产品推荐
相关产品推荐

