在R语言中如何依据组内首行值过滤完整分组?
问题:按分组移除首行
gameplayed为No的组 我有一个data frame,希望按team列分组后,移除所有组内首行gameplayed列值为No的完整分组。
示例数据集
df <- data.frame(team=c('A', 'A', 'A', 'A', 'B', 'B', 'B', 'C', 'D', 'D', 'D', 'E', 'E'), gameplayed=c('Yes', 'No', 'Yes', 'Yes', 'No', 'Yes', 'No', 'Yes', 'Yes', 'No', 'Yes', 'No', 'Yes'))
期望输出
df2 <- data.frame(team=c('A', 'A', 'A', 'A', 'C', 'D', 'D', 'D'), gameplayed=c('Yes', 'No', 'Yes', 'Yes', 'Yes', 'Yes', 'No', 'Yes'))
尝试过的代码(未成功)
df %>% group_by(team) %>% filter("Yes" == first(gameplayed))
解决方案
你的代码逻辑方向是对的,调整写法并补充ungroup()即可得到目标结果:
library(dplyr) df %>% group_by(team) %>% filter(first(gameplayed) == "Yes") %>% ungroup()
说明
first(gameplayed) == "Yes":针对每个分组,判断组内首行的gameplayed值是否为Yes,满足条件的分组会被完整保留ungroup():将分组后的结果转回普通data frame,和你期望的df2结构一致
如果原代码报错,大概率是first()函数被其他包的同名函数覆盖,改用指定包名的写法可以避免这个问题:
df %>% group_by(team) %>% filter(dplyr::first(gameplayed) == "Yes") %>% ungroup()
内容的提问来源于stack exchange,提问作者Confusius
相关产品推荐
相关产品推荐

