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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 00:54:52