R计算时间序列数据中接下来几天的平均值
我有一个包含三个变量的数据集:日期、信号和值。现在我想变异一个新的列,它是以信号为条件,并根据值列计算的 如果前一天有信号ifelselagsignal==1,则计算随后三天的平均值。 在本例中,我使用了以下表达式: 价值+领先价值+领先价值,n=2/3 所以我得到了我想要的:R计算时间序列数据中接下来几天的平均值,r,dataframe,dplyr,R,Dataframe,Dplyr,我有一个包含三个变量的数据集:日期、信号和值。现在我想变异一个新的列,它是以信号为条件,并根据值列计算的 如果前一天有信号ifelselagsignal==1,则计算随后三天的平均值。 在本例中,我使用了以下表达式: 价值+领先价值+领先价值,n=2/3 所以我得到了我想要的: set.seed(123) df<-tibble(date=today()+0:10, signal=c(0,1,0,0,0,0,1,0,0,0,0), value= sample.i
set.seed(123)
df<-tibble(date=today()+0:10,
signal=c(0,1,0,0,0,0,1,0,0,0,0),
value= sample.int(n=11))
df%>%mutate(calculation=ifelse(lag(signal)==1,
(value+lead(value)+lead(value, n = 2)) /3,
NA))
# A tibble: 11 x 4
date signal value calculation
<date> <dbl> <int> <dbl>
1 2019-07-17 0 1 NA
2 2019-07-18 1 7 NA
3 2019-07-19 0 5 6.33
4 2019-07-20 0 4 NA
5 2019-07-21 0 10 NA
6 2019-07-22 0 2 NA
7 2019-07-23 1 9 NA
8 2019-07-24 0 3 7.33
9 2019-07-25 0 11 NA
10 2019-07-26 0 8 NA
11 2019-07-27 0 6 NA
但我的问题是,我不想只使用接下来的3天。
我想用几天。所以我想自动化代码并计算几个列。也许有一个应用函数
以下是我在本例中希望在接下来的5天内完成的输出:
date signal value calc_day_1 calc_day2 calc_day3 calc_day4 calc_day5
<date> <dbl> <int> <dbl> <dbl> <dbl> <dbl> <dbl>
1 2019-07-17 0 1 NA NA
2 2019-07-18 1 7 NA NA
3 2019-07-19 0 5 5 (5+4)/2=4.5
4 2019-07-20 0 4 NA NA
5 2019-07-21 0 10 NA NA
6 2019-07-22 0 2 NA NA
7 2019-07-23 1 9 NA NA
8 2019-07-24 0 3 3 (3+11)/2=7
9 2019-07-25 0 11 NA NA
10 2019-07-26 0 8 NA NA
11 2019-07-27 0 6 NA NA
有人能告诉我如何解决这个问题吗?您好,您可以使用rlang包和purrr包,如下所示:
library(tidyverse)
myfun <- paste0("if_else(lag(signal) == 1, map_dbl(1:n(), ~mean(value[.x - 1 + 1:",
1:5 ,"])), NA_real_)") %>%
setNames(paste0("calc_day", 1:5)) %>%
purrr::map(rlang::parse_expr)
df %>%
mutate(!!! myfun)
# A tibble: 11 x 8
date signal value calc_day1 calc_day2 calc_day3 calc_day4 calc_day5
<date> <dbl> <int> <dbl> <dbl> <dbl> <dbl> <dbl>
1 2019-07-17 0 3 NA NA NA NA NA
2 2019-07-18 1 11 NA NA NA NA NA
3 2019-07-19 0 2 2 4 6 5.75 5.4
4 2019-07-20 0 6 NA NA NA NA NA
5 2019-07-21 0 10 NA NA NA NA NA
6 2019-07-22 0 5 NA NA NA NA NA
7 2019-07-23 1 4 NA NA NA NA NA
8 2019-07-24 0 9 9 8.5 6 6.25 NA
9 2019-07-25 0 8 NA NA NA NA NA
10 2019-07-26 0 1 NA NA NA NA NA
11 2019-07-27 0 7 NA NA NA NA NA
所以理论上你可以每次复制这行5次,用相应的数字替换2
或者您可以使用rlang软件包,请参见快捷方式:。是。这就是我要找的。但是为什么你在df%>%mutate中使用这三个感叹号呢!!!我的乐趣?请看康拉德·鲁道夫在我的答案中链接的问题中的答案。
df %>%
mutate(calc_day2 = if_else(lag(signal) == 1, map_dbl(1:n(), ~ mean(value[.x - 1 + 1:2])), NA_real_))