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

在R中使用条件语句过滤分组数据的技术求助

解决分组数据框的行过滤问题

先看你的原始数据:

id <- c(1,1,1,2,3,3,4,4,4,5,5,6)
x <- c(0,1,0,0,1,1,0,0,1,0,0,1)
df <- data.frame(id, x)

你的需求是:每个id组中,若存在x=1,则删除该组中第一个1之前的所有0行;若组内没有1,则保留所有行。

你之前的代码逻辑有误,first(x)==1 | x == 0的判断无法区分「1之前的0」和「1之后的0」,所以得不到预期结果。

正确的dplyr实现代码

library(dplyr)

df_result <- df %>%
  group_by(id) %>%
  filter(
    # 有1的组保留第一个1及之后的行;无1的组保留全部行
    cumsum(x == 1) > 0 | all(x == 0)
  ) %>%
  ungroup()

print(df_result)

代码逻辑解释

  • cumsum(x == 1):对每个组内的x列,遇到1时累加计数,第一个1之后的所有行,这个值都会大于0;而第一个1之前的0,这个值为0。
  • all(x == 0):判断当前组是否全为0,若是则保留所有行。
  • 两者用|组合,正好匹配你的需求。

运行后得到的结果和你预期一致:

# A tibble: 9 × 2
     id     x
  <dbl> <dbl>
1     1     1
2     1     0
3     2     0
4     3     1
5     3     1
6     4     1
7     5     0
8     5     0
9     6     1

内容的提问来源于stack exchange,提问作者T Richard

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 23:15:57