2017-01-07 14 views
3

Я хотел бы создать функцию, которая может вычислять движущееся среднее для переменного числа последних наблюдений и разных переменных. Возьмем это как макет данных:Перемещение среднего как функция в dplyr

df = expand.grid(site = factor(seq(10)), 
       year = 2000:2004, 
       day = 1:50) 
df$temp = rpois(dim(df)[1], 5) 

Расчет на 1 переменную и фиксированное число последних наблюдений. Например. это вычисляет среднее значение температуры за последние 5 дней:

library(dplyr) 
library(zoo) 

df <- df %>% 
      group_by(site, year) %>% 
       arrange(site, year, day) %>% 
         mutate(almost_avg = rollmean(x = temp, 5, align = "right", fill = NA)) %>% 
          mutate(avg = lag(almost_avg, 1)) 

Пока все хорошо. Теперь попытка функционализации терпит неудачу.

avg_last_x <- function(dataframe, column, last_x) { 

    dataframe <- dataframe %>% 
    group_by(site, year) %>% 
     arrange(site, year, day) %>% 
     mutate(almost_avg = rollmean(x = column, k = last_x, align = "right", fill = NA)) %>% 
      mutate(avg = lag(almost_avg, 1)) 

    return(dataframe) } 

avg_last_x(dataframe = df, column = "temp", last_x = 10) 

Я получаю эту ошибку:

Error in mutate_impl(.data, dots) : k <= n is not TRUE 

Я понимаю, это, вероятно, связано с evaluation mechanism in dplyr, но я не получаю это исправлено.

Заранее за вашу помощь.

ответ

6

Это должно исправить это.

library(lazyeval) 

avg_last_x <- function(dataframe, column, last_x) { 
    dataframe %>% 
    group_by(site, year) %>% 
    arrange(site, year, day) %>% 
    mutate_(almost_avg = interp(~rollmean(x = c, k = last_x, align = "right", 
              fill = NA), c = as.name(column)), 
      avg = ~lag(almost_avg, 1)) 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^