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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:23:33