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

按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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 09:01:08