R-прокручивание индивидуальной функции dplyr

Мне нужно извлечь выбросы из файла 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 для каждого переданного элемента группы.


person GabyLP    schedule 21.01.2018    source источник
comment
я действительно не вижу смысла получать выбросы для каждых 3 наблюдений   -  person mtoto    schedule 21.01.2018
comment
@mtoto, это всего лишь пример таблицы.   -  person GabyLP    schedule 21.01.2018
comment
тогда вы можете показать пример ожидаемого результата?   -  person mtoto    schedule 21.01.2018
comment
@mtoto Функция была неправильной, так как я хочу знать, является ли значение, которое я анализирую, выбросом с учетом предыдущих значений k. Я разместил ответ. Мне удалить весь вопрос?   -  person GabyLP    schedule 21.01.2018
comment
нет, просто прими свой ответ   -  person mtoto    schedule 21.01.2018


Ответы (1)


Моя ошибка заключалась в том, что функция создавала вектор для каждого наблюдения. И мне нужно получить только последний. Итак, изменение:

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
person GabyLP    schedule 21.01.2018