R语言按分组统计从指定值起始的连续序列长度
R实现按分组统计指定起始值的连续递增序列长度
实现思路
对每个分组的数值列执行以下逻辑:
- 查找指定起始值第一次出现的位置,未找到直接返回0
- 从起始位置开始向后遍历,统计连续满足「当前值 = 前一个值 +1」的元素个数,出现不满足的情况立即终止统计
- 返回统计的长度作为该分组的结果
代码实现
首先自定义核心统计函数:
get_consecutive_run <- function(x, start_val) { # 定位起始值第一次出现的位置 start_pos <- which(x == start_val)[1] if (is.na(start_pos)) return(0) # 截取从起始位置开始的子序列 sub_vec <- x[start_pos:length(x)] # 判断相邻元素是否满足+1的递增要求 diff_valid <- c(TRUE, diff(sub_vec) == 1) # 定位第一个不满足的位置,计算有效长度 break_pos <- which(!diff_valid)[1] return(ifelse(is.na(break_pos), length(sub_vec), break_pos - 1)) }
tidyverse方案(推荐,写法简洁易读)
加载dplyr后分组调用函数即可:
library(dplyr) # 起始值为1的统计结果 input.df %>% group_by(names) %>% summarise(runs = get_consecutive_run(goals, start_val = 1)) %>% ungroup() # 起始值为3的统计结果 input.df %>% group_by(names) %>% summarise(runs = get_consecutive_run(goals, start_val = 3)) %>% ungroup()
基础R方案(无需额外依赖包)
使用aggregate函数分组统计:
# 起始值为1的统计结果 aggregate(goals ~ names, input.df, FUN = \(x) get_consecutive_run(x, 1)) # 起始值为3的统计结果 aggregate(goals ~ names, input.df, FUN = \(x) get_consecutive_run(x, 3))
输出验证
两种方案的运行结果和示例预期输出完全一致。
内容的提问来源于stack exchange,提问作者user547928359
相关产品推荐
相关产品推荐

