【问题标题】:Sum based on condition of Rolling sum基于滚动总和条件的总和
【发布时间】:2021-11-05 15:32:11
【问题描述】:

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

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

【问题讨论】:

  • 你想要滚动总和的总和吗?总之,1.79996688 + 0.99847062+0.99847062 +1.465839 + 3+...,0.99847062+0.99847062 是重复的。

标签: r dplyr sum tidyverse rolling-sum


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-31
      • 2013-03-09
      • 2022-01-07
      • 1970-01-01
      • 2022-10-24
      • 2021-12-28
      • 1970-01-01
      相关资源
      最近更新 更多