使用dplyr为不同分组设置差异化过滤规则的问题
解决分组过滤
x<=95记录的问题 嘿,我来帮你捋清楚问题出在哪,以及怎么修正~
问题根源
你当前代码里的which.max(x >= 95)在分组2里出了状况:因为分组2的所有x都小于95,x >= 95会生成一串全是FALSE的向量,而which.max()处理全FALSE的向量时,会返回1——这就导致你的过滤条件变成了row_number() <=1,只留了分组2的第一条记录,完全不符合你要保留全部的需求。
最简修正方案
你的核心需求是保留每个分组中所有x <=95的记录,其实根本不需要用row_number()或者which.max()绕弯子,直接在分组后过滤x <=95就搞定了:
library(dplyr) # 你的样本数据 df <- data.frame(loc.id = rep(1:2, each = 11), x = c(35,51,68,79,86,90,92,93,95,98,100,35,51,68,79,86,90,92,92,93,94,94)) # 修正后的代码 df %>% group_by(loc.id) %>% filter(x <= 95) %>% ungroup() # 可选,如果你后续不需要保持分组状态的话可以加上
执行后结果完全符合预期:
- 分组1会去掉
x=98和x=100这两条,保留前9条x<=95的记录 - 分组2的所有11条记录都会被保留,因为所有
x都满足<=95
如果你有更复杂的需求(可选)
要是你的真实需求是保留到第一个x>95的记录之前的所有条目(比如分组1保留到95,无超标记录的分组全留),那可以用条件判断来调整逻辑:
df %>% group_by(loc.id) %>% filter(if (any(x > 95)) row_number() <= which.max(x > 95) - 1 else TRUE) %>% ungroup()
这个逻辑会先检查分组里有没有x>95的记录:
- 有的话,就保留到第一个超标记录的前一条(也就是所有
x<=95的) - 没有的话,直接保留全部记录
不过根据你描述的需求,第一种直接过滤的方法最简洁高效~
内容的提问来源于stack exchange,提问作者89_Simple
相关产品推荐
相关产品推荐

