R 在一列中创建每三行的滚动平均值,并将其存储在新变量中

R 在一列中创建每三行的滚动平均值,并将其存储在新变量中,r,dplyr,moving-average,R,Dplyr,Moving Average,我试图获得特定列中每三(或第二)行的滚动平均值。更确切地说,我希望将滚动平均值存储在现有数据帧中的新变量中 我尝试使用此功能: w %>% mutate(rmean = roll_meanl(SWI_001, 3)) %>% filter(between(date, 2, 4)) %>% select(-date) 我想要每三行变量SWI_001的滚动平均值。带有数据的新变量应为roll_mean1 但我不知道如何正确过滤它 我的dataframe(w)看起

我试图获得特定列中每三(或第二)行的滚动平均值。更确切地说,我希望将滚动平均值存储在现有数据帧中的新变量中

我尝试使用此功能:

w %>% 
  mutate(rmean = roll_meanl(SWI_001, 3)) %>% 
  filter(between(date, 2, 4)) %>% 
  select(-date)
我想要每三行变量SWI_001的滚动平均值。带有数据的新变量应为roll_mean1

但我不知道如何正确过滤它

我的dataframe(w)看起来像这样,但是总共有255行,几乎有50列:

           Date ASS_SUB ASS_TOP SWI_001 SWI_005 SWI_010 SWI_100 B1_005 B1_015 B1_025 B1_035 B1_045 B1_055 B1_065
  1: 06.11.2018   17.37   14.16   15.54      NA   15.57      NA     NA     NA     NA     NA     NA     NA     NA
  2: 07.11.2018   17.32   13.90   15.21      NA   15.51      NA   14.4   14.8   14.8   14.8   14.8   14.8   14.8
  3: 08.11.2018   17.29   13.77   14.75      NA   15.39      NA   14.2   14.8   14.8   14.8   14.8   14.8   14.8
  4: 09.11.2018   17.27   13.64   15.05      NA   15.38      NA   14.0   14.8   14.8   14.8   14.8   14.8   14.8
  5: 10.11.2018   17.24   13.64   14.89      NA   15.30      NA   13.9   14.8   14.8   14.8   14.8   14.8   14.8
 ---                                                                                                            

最后,我需要不止一列的滚动平均值,但为了开始,我很高兴能朝着正确的方向推进。

有很多不同的方法可以做到这一点:

  • 您可以使用
    zoo
    包(
    rollmean
    )中的滚动平均值/最大值/中间值函数
  • 使用
    TTR
  • 预测中使用
    ma
另见此处:

对于下一个问题,如果您可以使用
dput()
,将数据包含在您列出的代码中,那就太好了-我尝试快速重新创建它:

库(tidyverse)
tibble::tribble(
~Date、~ASS_SUB、~ASS_TOP、~SWI_001、~SWI_005、~SWI_010、~SWI_100、~B1_005、~B1_015、~B1_025、~B1_035、~B1_045、~B1_055、~B1_065、,
“2018年11月6日”,17.37,14.16,15.54,不适用,15.57,不适用,不适用,不适用,不适用,不适用,不适用,
“2018年11月7日”,17.32,13.90,15.21,NA,15.51,NA,14.4,14.8,14.8,14.8,14.8,14.8,14.8,14.8,14.8,
“2018年11月8日”,17.29,13.77,14.75,不适用,15.39,不适用,14.2,14.8,14.8,14.8,14.8,14.8,14.8,14.8,
“2018年11月9日”,17.27,13.64,15.05,NA,15.38,NA,14.0,14.8,14.8,14.8,14.8,14.8,14.8,14.8,14.8,
“2018年11月10日”,17.24,13.64,14.89,不适用,15.30,不适用,13.9,14.8,14.8,14.8,14.8,14.8,14.8,14.8,14.8
)->w
例如,我将使用
zoo
包中的
rollmean
。我们使用
fill=NA
选项来指示如果没有3个值(一个在前面,一个在后面),那么值应该是
NA
。这意味着您不必过滤数据。当然,您可以对此进行修改-使用
?na.fill
查看更多信息

图书馆(动物园)
w%>%
突变(rmean=rollmean(SWI_001,3,fill=NA))
如果要将其应用于大量列,可以使用
dplyr
包中的
cross()
命令:

w%>%
突变(跨越(.cols=c(SWI_001,SWI_010),.fns=~rollmean(,3,fill=NA),.names=“{.col}\u rmean”))
甚至对于所有数字列:

w%>%
mutate(跨(.cols=where(is.numeric),.fns=~rollmean(,3,fill=NA),.names=“{.col}\u rmean”))
关于过滤的更多信息:

我不确定
1:
2:
等是否属于
Date
变量的一部分(下面的案例1)或仅仅是行号(案例2)。但无论如何,我建议使用以下任一方法将列转换为
Date
格式:

案例1:

w%>%
突变(日期=gsub(“[0-9]:”,“,”,日期),
日期=截止日期(日期,格式=“%d.%m.%Y”))
案例2:

w%>%
变异(日期=as.Date(日期,格式=“%d.%m.%Y”))
一旦有了这些,您就可以使用(并从上面进行组合)轻松过滤:

w%>%
突变(日期=gsub(“[0-9]:”,“,”,日期),
日期=截止日期(日期,格式=“%d.%m.%Y”))%>%
变异(跨越(.cols=c(SWI_001,SWI_010),.fns=~rollmean(,3,fill=NA),.names=“{.col}\u rmean”))%>%
过滤器(介于(日期、截止日期(“2018-11-07”)和截止日期(“2018-11-09”)之间)