在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
相关产品推荐
相关产品推荐

