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()
逻辑解释
group_by(id):按id字段分组处理数据sum(category == 'yes', na.rm = TRUE):计算每个分组中'yes'的总数量,na.rm=TRUE确保NA值不会干扰统计结果filter(...) ==1:只保留'yes'总数恰好为1的分组ungroup():取消分组状态,将结果转为普通数据框格式
运行上述代码后,即可得到符合预期的输出结果。
内容的提问来源于stack exchange,提问作者Mahlet Tadesse
相关产品推荐
相关产品推荐

