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

统计连续重复数据行数:实现df到df_out格式转换的技术问询

解决连续重复值的分组汇总问题

这是个很常见的连续序列分组需求,我用tidyverse工具链给你一步步实现,完全贴合你的目标输出~

首先先确认你的原始数据:

library(tidyverse)

df <- tibble(
  ID = rep( "ID1", 8),
  month = paste0("M", seq(0,7)),
  var = c(rep("ESC", 5), "VOL", rep("ESC", 2))
)

接下来是核心处理代码,每一步我都给你注释清楚:

df_out <- df %>%
  # 给连续相同的var值创建分组ID:当当前行var和上一行不同时,分组ID+1
  mutate(group_id = cumsum(var != lag(var, default = first(var)))) %>%
  # 按ID、分组ID、var分组,确保每个连续重复的组被单独处理
  group_by(ID, group_id, var) %>%
  # 汇总每个组的信息
  summarise(
    # 如果组内只有1个元素,直接用当前month;否则拼接首尾month
    month = if_else(n() == 1, first(month), paste(first(month), last(month), sep = "-")),
    # 统计每组的元素个数(也就是连续重复次数)
    N = n(),
    # 取消分组,返回普通tibble
    .groups = "drop"
  ) %>%
  # 移除临时用的group_id列
  select(-group_id)

运行后查看结果,和你想要的df_out完全一致:

df_out
#> # A tibble: 3 × 4
#>   ID    var   month   N
#>   <chr> <chr> <chr> <int>
#> 1 ID1   ESC   M0-M4     5
#> 2 ID1   VOL   M5        1
#> 3 ID1   ESC   M6-M7     2

补充:用data.table的实现方式

如果你习惯用data.table,也可以用更简洁的写法:

library(data.table)
setDT(df)

df_out <- df[, .(
  month = if (.N == 1) month else paste(first(month), last(month), sep = "-"),
  N = .N
), by = .(ID, var, rleid(var))][, rleid := NULL][]

两种方法都能精准得到你需要的汇总结果~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 08:17:56