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

R语言:如何筛选category列仅含单个'yes'值的分组id

筛选category列仅含单个'yes'值的id分组

现有如下R语言数据框,需求是筛选出category列中仅包含单个'yes'值的id分组:

data <- data.frame(id=c(1,1,1,1,1,1,2,2,2,2,2,3,3,3,3,3,4,4,4,4,4,5,5,5,5,6,6,6,6,6),
category=c(NA,'no',NA,'yes',NA,'yes',NA,NA,'no',NA,'no','yes',NA,'no','yes','no','no',NA,'no',NA,'yes','no',NA,'yes','no',NA,'no','yes','no','yes'))

期望输出结果:

id category
1  4       no
2  4     <NA>
3  4       no
4  4     <NA>
5  4      yes
6  5       no
7  5     <NA>
8  5      yes
9  5       no

错误尝试

本人尝试使用以下dplyr代码实现,但未达到预期效果:

library(dplyr)
data1 <- data %>% 
  group_by(id) %>% 
  filter((cumsum(category == 'yes')<= 1), na.rm=TRUE) %>%
  ungroup

正确解法

你的代码逻辑有误:cumsum(category == 'yes')<=1是逐行判断累计'yes'数量是否≤1,而我们需要的是整个id分组内的'yes'总数等于1。正确的做法是先统计每个id的'yes'总数,再筛选总数为1的分组:

library(dplyr)

data1 <- data %>%
  group_by(id) %>%
  # 统计当前id分组内'yes'的数量,na.rm=TRUE忽略NA值的影响
  filter(sum(category == 'yes', na.rm = TRUE) == 1) %>%
  ungroup()

逻辑解释

  1. group_by(id):按id字段分组处理数据
  2. sum(category == 'yes', na.rm = TRUE):计算每个分组中'yes'的总数量,na.rm=TRUE确保NA值不会干扰统计结果
  3. filter(...) ==1:只保留'yes'总数恰好为1的分组
  4. ungroup():取消分组状态,将结果转为普通数据框格式

运行上述代码后,即可得到符合预期的输出结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 23:31:17