R-滚动自定义函数dplyr
R- rolling customized function dplyr
我需要从 ts 中提取异常值。我想使用自定义函数,例如:
es_outlier<-function(vect){
m=mean(vect)
s=sd(vect)
vector_final=abs(vect)>abs(m+s*1.5)
return(vector_final )
}
我的 table 会是(一个简短的例子):
tbl<-data.frame(aa=c('a','b', 'a', 'a','a', 'b', 'b', 'b', 'a', 'b', 'a'),
fecha=seq.Date(from=as.Date('01-01-2001', format='%d-%m-%Y'),
to=as.Date('01-11-2001',format='%d-%m-%Y'), by='month'),
cant=c(runif(10),1000))
因此,我想要一个 table 带有一个带有零(或 False)的额外列,但异常值(True 或 1)除外,例如:
aa fecha cant outl
a 2001-01-01 7.586968e-01 NA
a 2001-03-01 9.939139e-01 NA
a 2001-04-01 6.064410e-01 NA
a 2001-05-01 2.937717e-02 NA
a 2001-09-01 4.321826e-02 FALSE
a 2001-11-01 1.000000e+03 TRUE
b 2001-02-01 9.572499e-01 NA
b 2001-06-01 3.364454e-01 NA
b 2001-07-01 2.776581e-01 NA
b 2001-08-01 1.171976e-01 NA
b 2001-10-01 3.703098e-01 FALSE
所以为了应用它,我使用了 rollapply:
library(dplyr)
tbl%>%group_by(aa)%>%arrange(aa,fecha) %>%
mutate(outl=rollapply(cant,5, es_outlier, align='right', fill=NA))
但是我得到了以下错误:
Error in mutate_impl(.data, dots) : Column outl
must be length 6
(the group size) or one, not 30
函数returns 为传递的组中的每个元素包含 T 或 F 的向量。
我的错误是该函数为每个观察创建了一个向量。我只需要得到最后一个。
所以变化是:
es_outlier<-function(vect){
m=mean(vect)
s=sd(vect)
vector_final=abs(vect)>abs(m+s*1.5)
return(vector_final[length(vect)] )
}
结果:
tbl%>%group_by(aa)%>%arrange(aa,fecha) %>%
mutate(outl=rollapply(cant,5, es_outlier, align='right', fill=NA))
# Groups: aa [2]
aa fecha cant outl
<fctr> <date> <dbl> <lgl>
a 2001-01-01 7.586968e-01 NA
a 2001-03-01 9.939139e-01 NA
a 2001-04-01 6.064410e-01 NA
a 2001-05-01 2.937717e-02 NA
a 2001-09-01 4.321826e-02 FALSE
a 2001-11-01 1.000000e+03 TRUE
b 2001-02-01 9.572499e-01 NA
b 2001-06-01 3.364454e-01 NA
b 2001-07-01 2.776581e-01 NA
b 2001-08-01 1.171976e-01 NA
b 2001-10-01 3.703098e-01 FALSE
我需要从 ts 中提取异常值。我想使用自定义函数,例如:
es_outlier<-function(vect){
m=mean(vect)
s=sd(vect)
vector_final=abs(vect)>abs(m+s*1.5)
return(vector_final )
}
我的 table 会是(一个简短的例子):
tbl<-data.frame(aa=c('a','b', 'a', 'a','a', 'b', 'b', 'b', 'a', 'b', 'a'),
fecha=seq.Date(from=as.Date('01-01-2001', format='%d-%m-%Y'),
to=as.Date('01-11-2001',format='%d-%m-%Y'), by='month'),
cant=c(runif(10),1000))
因此,我想要一个 table 带有一个带有零(或 False)的额外列,但异常值(True 或 1)除外,例如:
aa fecha cant outl
a 2001-01-01 7.586968e-01 NA
a 2001-03-01 9.939139e-01 NA
a 2001-04-01 6.064410e-01 NA
a 2001-05-01 2.937717e-02 NA
a 2001-09-01 4.321826e-02 FALSE
a 2001-11-01 1.000000e+03 TRUE
b 2001-02-01 9.572499e-01 NA
b 2001-06-01 3.364454e-01 NA
b 2001-07-01 2.776581e-01 NA
b 2001-08-01 1.171976e-01 NA
b 2001-10-01 3.703098e-01 FALSE
所以为了应用它,我使用了 rollapply:
library(dplyr)
tbl%>%group_by(aa)%>%arrange(aa,fecha) %>%
mutate(outl=rollapply(cant,5, es_outlier, align='right', fill=NA))
但是我得到了以下错误:
Error in mutate_impl(.data, dots) : Column
outl
must be length 6 (the group size) or one, not 30
函数returns 为传递的组中的每个元素包含 T 或 F 的向量。
我的错误是该函数为每个观察创建了一个向量。我只需要得到最后一个。 所以变化是:
es_outlier<-function(vect){
m=mean(vect)
s=sd(vect)
vector_final=abs(vect)>abs(m+s*1.5)
return(vector_final[length(vect)] )
}
结果:
tbl%>%group_by(aa)%>%arrange(aa,fecha) %>%
mutate(outl=rollapply(cant,5, es_outlier, align='right', fill=NA))
# Groups: aa [2]
aa fecha cant outl
<fctr> <date> <dbl> <lgl>
a 2001-01-01 7.586968e-01 NA
a 2001-03-01 9.939139e-01 NA
a 2001-04-01 6.064410e-01 NA
a 2001-05-01 2.937717e-02 NA
a 2001-09-01 4.321826e-02 FALSE
a 2001-11-01 1.000000e+03 TRUE
b 2001-02-01 9.572499e-01 NA
b 2001-06-01 3.364454e-01 NA
b 2001-07-01 2.776581e-01 NA
b 2001-08-01 1.171976e-01 NA
b 2001-10-01 3.703098e-01 FALSE