首页 文章

R-滚动定制功能dplyr

提问于
浏览
1

我需要从ts中提取异常值 . 我想使用自定义功能,如:

es_outlier<-function(vect){
  m=mean(vect)
  s=sd(vect)
  vector_final=abs(vect)>abs(m+s*1.5)
return(vector_final )
}

我的表是(一个简短的例子):

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))

我希望结果是一个带有零(或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))

但是我收到以下错误:

mutate_impl(.data,dots)中的错误:列outl必须是长度为6(组大小)或一个,而不是30

该函数返回一个带有T或F的向量,用于传递的组的每个元素 .

1 回答

  • 2

    我的错误是该函数正在为每个观察创建一个向量 . 而我只需要获得最后一个 . 所以变化是:

    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
    

相关问题