统计连续重复数据行数:实现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
相关产品推荐
相关产品推荐

