R计算时间序列数据中接下来几天的平均值

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

我有一个包含三个变量的数据集:日期、信号和值。现在我想变异一个新的列,它是以信号为条件,并根据值列计算的

如果前一天有信号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.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_))