0

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

在另一种情况下,我有降水数据,如果两天内降雨量超过 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
4

2 回答 2

1

您可以使用rollsumfromzoo执行滚动计算。如果 2 个数字之和大于 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
于 2021-09-09T07:38:09.767 回答
1

如果我正确理解您的问题,您需要前一个值 + 当前值的滚动总和。然后,如果该总和大于 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))

如果这不是您想要完成的,请澄清。

于 2021-09-09T02:17:14.260 回答