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

在R语言中按指定列分组统计列内连续重复前项的次数

在R语言中按规则生成CountByGroup列

需求明确:按Group列分组,每组首行的CountByGroup值为1;若当前行的Status与同组内前一行的Status相同,则计数在前一项基础上加1;若不同则重置为1。

先给出示例数据:

Group <- c("AGroup", "AGroup", "AGroup", "AGroup", "BGroup", "BGroup", "BGroup", "BGroup", "CGroup", "CGroup", "CGroup", "CGroup")
Status <- c("Low", "Low", "High", "High", "High", "Low", "High", "Low", "Low", "Low", "High", "High")
df <- data.frame(Group, Status)

方法1:使用dplyr(tidyverse)

借助dplyr的分组和突变功能,先标记Status的连续变化点,再对每个连续段生成递增计数:

library(dplyr)

df <- df %>%
  group_by(Group) %>%
  mutate(
    # 标记当前行是否是新的Status连续段的起始行
    status_change = c(TRUE, Status[-1] != Status[-n()]),
    # 对每个连续段生成1、2、...的序列
    CountByGroup = ave(cumsum(status_change), cumsum(status_change), FUN = seq_along)
  ) %>%
  ungroup() %>%
  select(-status_change) # 移除临时辅助列

方法2:使用Base R

无需加载额外包,用ave嵌套处理分组和连续计数:

df$CountByGroup <- ave(df$Status, df$Group, 
                       FUN = function(x) {
                         # 生成每个连续Status段的分组标识
                         segment_id <- cumsum(c(TRUE, x[-1] != x[-length(x)]))
                         # 对每个标识段生成递增序列
                         ave(rep(1, length(x)), segment_id, FUN = seq_along)
                       })

运行任意一种方法后,查看结果:

print(df)

输出与需求示例完全一致:

Group Status CountByGroup
1  AGroup    Low            1
2  AGroup    Low            2
3  AGroup   High            1
4  AGroup   High            2
5  BGroup   High            1
6  BGroup    Low            1
7  BGroup   High            1
8  BGroup    Low            1
9  CGroup    Low            1
10 CGroup    Low            2
11 CGroup   High            1
12 CGroup   High            2

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 19:01:19