如何从 R 中的单元格进行移动总和?

How can I make a moving sum from a cell in R?

我的数据框如下所示:

date P >60?
03-31-2020 6.8 0
03-30-2020 5.0 0
03-29-2020 0.0 0
03-28-2020 0.0 0
03-27-2020 2.0 0
03-26-2020 0.0 0
03-25-2020 71.0 1
03-24-2020 2.0 0
03-23-2020 0.0 0
03-22-2020 23.8 0
03-21-2020 0.0 0
03-20-2020 23.8 0
df1 <- data.frame(date = c("03-31-2020", "03-30-2020", "03-29-2020", "03-28-2020", "03-27-2020", "03-26-2020", 
                           "03-25-2020", "03-24-2020", "03-23-2020", "03-22-2020", "03-21-2020", "03-20-2020"),
                  P = c(6.8, 5.0, 0.0, 0.0, 2.0, 0.0, 71.0, 2.0, 0.0, 23.8, 0.0, 23.8),
                  Sup60 = c(0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0))

我想对 P > 60 前 N 天的 P 值求和。 例如,第一个障碍(大于 60 的数字)是 2020 年 3 月 25 日那天的 P = 71,由此我想对那天之前的 5 个 P 值求和,例如:

2.0 + 0.0 + 23.8 + 0.0 + 23.8 = 49,6

它是一种移动和,因为这个概念类似于移动平均线。 例如,我想要的不是最后 5 个值的平均值,而是大于 60 的值的最后 5 个值的总和。 我该怎么做?

您好,首先我们可以解决如何计算 运行 总和,然后我们在此列上做一个 if_else,作为一般规则,您总是将复杂的问题拆分为可解决的小问题

library(tidyverse)
df_example <- tibble::tribble(
         ~date,   ~P, ~`>60?`,
  "03-31-2020",  6.8,      0L,
  "03-30-2020",    5,      0L,
  "03-29-2020",    0,      0L,
  "03-28-2020",    0,      0L,
  "03-27-2020",    2,      0L,
  "03-26-2020",    0,      0L,
  "03-25-2020",   71,      1L,
  "03-24-2020",    2,      0L,
  "03-23-2020",    0,      0L,
  "03-22-2020", 23.8,      0L,
  "03-21-2020",    0,      0L,
  "03-20-2020", 23.8,      0L
  )


# lets start by doing a simple running sum

jjj <- df_example |> 
  arrange(date)
  
jjj |> 
  mutate(running_sum = slider::slide_dbl(.x = P,.f = ~ sum(.x),.before = 5,.after = -1)) |> 
  mutate(chosen_sum = if_else(P > 60,running_sum,NA_real_))
#> # A tibble: 12 x 5
#>    date           P `>60?` running_sum chosen_sum
#>    <chr>      <dbl>  <int>       <dbl>      <dbl>
#>  1 03-20-2020  23.8      0         0         NA  
#>  2 03-21-2020   0        0        23.8       NA  
#>  3 03-22-2020  23.8      0        23.8       NA  
#>  4 03-23-2020   0        0        47.6       NA  
#>  5 03-24-2020   2        0        47.6       NA  
#>  6 03-25-2020  71        1        49.6       49.6
#>  7 03-26-2020   0        0        96.8       NA  
#>  8 03-27-2020   2        0        96.8       NA  
#>  9 03-28-2020   0        0        75         NA  
#> 10 03-29-2020   0        0        75         NA  
#> 11 03-30-2020   5        0        73         NA  
#> 12 03-31-2020   6.8      0         7         NA

reprex package (v2.0.1)

于 2021-10-20 创建