繁体   English   中英

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

[英]R Calculate the mean of the following days in time series data

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

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

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

嗨,您可以按以下方式使用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说明:如果您只想这些列之一(例如calc_day2 ),则可以执行以下操作:

df %>%
 mutate(calc_day2 = if_else(lag(signal) == 1, map_dbl(1:n(), ~ mean(value[.x - 1 + 1:2])), NA_real_)) 

因此,从理论上讲,您仅可以复制该行五次(每次用相应的数字替换2 )。

或者,您使用rlang包(另请参见此问题 )来获取快捷方式:)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM