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”)之间)