在R语言中使用accumulate结合嵌套条件设置数值上下限
解决带初始值与滞后值的条件累积计算问题
先给出可复现的数据:
date<-seq(as.Date('1968-04-01'),as.Date('1968-09-01'), by='month') x<-c(20,10,-15,-50,11,-12) df<-data.frame(date,x)
修正后的代码
你可以通过补充<0的条件判断,或者用更简洁的向量化函数来实现所有规则:
方式一:明确条件分支
library(dplyr) library(purrr) df %>% mutate(y = accumulate(x, ~ { temp <- .x + .y if (temp > 50) { 50 } else if (temp < 0) { 0 } else { temp } }, .init = 50)[-1])
方式二:用pmax/pmin简化逻辑
这种写法更简洁,直接把结果限制在0到50的区间内,完全匹配你的规则:
df %>% mutate(y = accumulate(x, ~ pmax(0, pmin(50, .x + .y)), .init = 50)[-1])
问题说明
原代码只处理了>50和≤50两种情况,但没有单独处理(x + lag(y)) < 0的场景,导致负数结果无法被替换为0。上述两种写法都补上了这个逻辑缺口,运行后得到的y列完全符合你的期望:c(50, 50, 35, 0, 11, 0)。
内容的提问来源于stack exchange,提问作者DAY
相关产品推荐
相关产品推荐

