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

基于多条件计算累加和(cumsum)的函数实现需求

自定义多条件累加和函数(R实现)

先看你提供的这份模拟数据,我把它整理成可直接运行的代码块:

set.seed(123)
df <- data.frame(loc.id = rep(1:10, each = 101*10),
                 year = rep(rep(2001:2010, each = 101), times = 10),
                 day = rep(rep(250:350, times = 10), times = 10),
                 ref.rain = rep(c(400,500,450,430,470,576,644,230,850,690), each = 10*101),
                 rain = runif(min = 0, max = 20, 10*101*10))

这份数据包含10个地点的降雨记录,每个地点覆盖2001-2010年的日序250到350时段,ref.rain是每个地点的参考降雨量。

接下来我写一个灵活的函数,支持多分组条件和自定义过滤规则来计算累加和,完全适配你的数据场景:

calc_cumsum <- function(data, group_vars, filter_expr, value_col = "rain") {
  # 检查并加载dplyr包(未安装则提示)
  if (!requireNamespace("dplyr", quietly = TRUE)) {
    stop("需要安装dplyr包,请先运行 install.packages('dplyr')")
  }
  library(dplyr)
  
  # 转换分组变量为dplyr可识别的符号
  group_syms <- rlang::syms(group_vars)
  
  # 执行分组、过滤、排序、累加计算
  data %>%
    group_by(!!!group_syms) %>%
    filter({{filter_expr}}) %>%
    arrange(day) %>% # 确保按日序排序,保证累加逻辑正确
    mutate(cumsum_rain = cumsum(.data[[value_col]])) %>%
    ungroup()
}

函数使用示例

给你几个常见场景的调用方式,方便快速上手:

  • 场景1:按地点+年份分组,计算所有日序的降雨累加和
result1 <- calc_cumsum(df, group_vars = c("loc.id", "year"), filter_expr = TRUE)
# 查看第一个地点2001年的累加结果
head(result1[result1$loc.id == 1 & result1$year == 2001, ])
  • 场景2:按地点分组,只计算日序≥300且单次降雨>5的记录累加和
result2 <- calc_cumsum(df, group_vars = "loc.id", filter_expr = day >= 300 & rain > 5)
  • 场景3:按地点分组,计算单次降雨超过参考降雨量1%的记录累加和
result3 <- calc_cumsum(df, group_vars = "loc.id", filter_expr = rain > ref.rain * 0.01)

函数参数说明

  • group_vars:传入字符向量,指定用于分组的变量(比如c("loc.id", "year"))
  • filter_expr:直接传入R逻辑表达式,指定要参与累加的记录条件
  • value_col:可选参数,指定要计算累加的目标列,默认是rain

这样你就可以根据不同需求,灵活组合分组和过滤条件来计算累加和啦~

内容的提问来源于stack exchange,提问作者89_Simple

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:50:28