基于多条件计算累加和(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
相关产品推荐
相关产品推荐

