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

时间:2019-07-17 12:15:40

标签: r dataframe dplyr

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

如果前一天(ifelse(lag(signal)==1)发出信号,则计算接下来三天的平均值。 在这种情况下,我使用了以下表达式:

(value+lead(value)+lead(value,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 

有人可以告诉我如何解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

您好,您可以按以下方式使用**p = 10 软件包和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 ),则可以执行以下操作:

calc_day2

因此,从理论上讲,您仅可以复制此行五次(每次将df %>% mutate(calc_day2 = if_else(lag(signal) == 1, map_dbl(1:n(), ~ mean(value[.x - 1 + 1:2])), NA_real_)) 替换为相应的数字)。

或者您使用2包(另请参见this question)来获取快捷方式:)。