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

如何用dplyr风格计算分组内基于末尾值的x连续为1的次数?

按分组统计末尾连续为1的次数

给定如下R语言数据框dat,需按grp字段分组,以每组order=4的记录为起点向前统计x字段连续等于1的次数,要求采用dplyr风格实现。

示例数据

library(dplyr)
dat <- data.frame(
  order = c(1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4),
  x = c(1, 1, 1, 0.5, 1, 1, 1, 1, 1, 0.5, 0.5, 1),
  grp = c(rep("gr1", 4), rep("grp2", 4), rep("grp3", 4))
)
dat
#>    order   x  grp
#> 1      1 1.0  gr1
#> 2      2 1.0  gr1
#> 3      3 1.0  gr1
#> 4      4 0.5  gr1
#> 5      1 1.0 grp2
#> 6      2 1.0 grp2
#> 7      3 1.0 grp2
#> 8      4 1.0 grp2
#> 9      1 1.0 grp3
#> 10     2 0.5 grp3
#> 11     3 0.5 grp3
#> 12     4 1.0 grp3

期望输出

#>   x  grp
#> 1 0 grp1
#> 2 4 grp2
#> 3 1 grp3

解决方案

dat %>%
  group_by(grp) %>%
  # 组内按order降序排列,确保从order=4的记录开始向前遍历
  arrange(desc(order), .by_group = TRUE) %>%
  # 标记当前x是否等于1
  mutate(is_one = x == 1) %>%
  # 用累积求和生成连续块的ID,遇到非1值时ID递增
  mutate(run_id = cumsum(!is_one)) %>%
  # 筛选出从末尾开始的连续1的块(run_id=0的部分)
  filter(run_id == 0) %>%
  # 统计该块的行数,即为连续1的次数
  summarise(x = n()) %>%
  ungroup()

代码说明

  1. group_by(grp):按grp字段分组处理
  2. arrange(desc(order), .by_group = TRUE):组内按order降序,让每组的第一条记录是order=4的末尾数据
  3. mutate(is_one = x == 1):标记每条记录的x是否为1
  4. mutate(run_id = cumsum(!is_one)):通过累积非1值的数量,将连续的1和非1分割成不同的块,从末尾开始的连续1会被标记为run_id=0
  5. filter(run_id == 0):仅保留从末尾开始的连续1的部分
  6. summarise(x = n()):统计该部分的行数,得到连续1的次数

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 02:50:32