如何从 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
- 重现
dataframe
的代码:
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 创建
我的数据框如下所示:
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 |
- 重现
dataframe
的代码:
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 创建