按ID从最新年份倒序统计连续超阈值的value次数的实现需求
按ID统计连续达标年份数(从最新年份倒序,遇阈值即停)
需求说明
现有包含id、year、value三列的数据框,需按id分组,从最新年份倒序检查value是否超过指定阈值(示例阈值为0),一旦遇到等于阈值的记录则停止统计,最终得到每个ID对应的连续达标年份数量。
示例数据
id <- rep(c("a", "b", "c"), each = 5) year <- rep(c(1997:2001), times = 3) value <- c(0.1, 0.5, 0, 0, 0, 0, 0.1, 0.6, 0.7, 0.4, 0.6, 0,0.3,0.5,0.5) data <- data.frame(id, year, value)
解决方案1:使用dplyr(tidyverse系列)
这是直观的tidy风格处理方式,步骤清晰易读:
library(dplyr) # 指定阈值 threshold <- 0 result <- data %>% group_by(id) %>% # 按年份降序排列,确保从最新年份开始检查 arrange(desc(year)) %>% # 标记达标状态,同时判断是否仍处于连续达标阶段(未遇到阈值) mutate( is_qualified = value > threshold, # 累积统计不达标次数,次数为0则说明还在连续达标期 still_qualified = cumsum(!is_qualified) == 0 ) %>% # 统计每个ID的连续达标年份数 summarise(continuous_qualified_years = sum(still_qualified)) %>% ungroup() # 查看结果 print(result)
输出结果
# A tibble: 3 × 2 id continuous_qualified_years <chr> <int> 1 a 0 2 b 4 3 c 3
解决方案2:使用Base R
无需加载额外包,直接用基础函数处理:
threshold <- 0 # 按ID分组处理 result_base <- do.call(rbind, by(data, data$id, function(df) { # 按年份降序排序 df_sorted <- df[order(-df$year), ] # 找到第一个等于阈值的记录位置 first_threshold_pos <- which(df_sorted$value == threshold)[1] # 计算连续达标数:无阈值记录则取全部行数,否则取位置减1 count <- ifelse(is.na(first_threshold_pos), nrow(df_sorted), first_threshold_pos - 1) data.frame(id = unique(df$id), continuous_qualified_years = count) })) # 查看结果 print(result_base)
输出结果
id continuous_qualified_years a a 0 b b 4 c c 3
内容的提问来源于stack exchange,提问作者user30335471
相关产品推荐
相关产品推荐

