r语言 - 基于滚动和条件的和



我想要得到数字的总和,但首先检查两个连续值的滚动和.

在另一个上下文中,我有降水数据,如果在两天内发生了超过3英寸的降雨量,我希望在最终总和中添加3英寸。

这里如果df包含降水数据,我想要df的和,但如果连续两天的滚动和增加3,它应该在计算最终和时将这两个数字的和减少到3。

。前两个数的和是2.78(1.79996688 + 0.99847062),应该使用已有的数。下一个和是2.45(0.99847062 +1.465839),它应该使用现有的数字。下一个2.86342148+1.44870719 = 4.3,大于3,这两天的最终和应该是3。

我希望最后只有一个值。上述情况的答案应该是1.79996688 +0.99847062 +0.99847062 +1.465839 +3+等。

set.seed(123)
df <- c(runif(100, min = 0, max = 3))
df

如果我正确理解你的问题,你想要一个前一个值+当前值的滚动和。然后,如果总和大于3,则需要"剪贴"。值,使最大值为3。我把它做成了一个包含几个步骤的数据框架,以便清楚地了解我在每一步中完成了什么:

set.seed(123)
df <- data.frame(x = c(runif(100, min = 0, max = 3)))
df <- df %>%
mutate(tot = lag(x, 1, default = 0) + x,
final = case_when(tot >= 3 ~  3,
tot <  3 ~ tot)) 
df %>% summarise(totalprecip = sum(final, na.rm = TRUE))

如果这不是你想要完成的,那就说清楚。

可以使用zoo中的rollsum进行滚动计算。如果两个数的和大于3,我们使用pmin来限制3处的值。最后,我们取所有值的sum,最后得到1个数字作为结果。

set.seed(123)
data <- runif(100, min = 0, max = 3)
result <- sum(pmin(zoo::rollsum(data, 2), 3))
result
#[1] 246.5425

最新更新