2017-01-07 6 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) 

는이 오류 얻을 :이은 아마도 evaluation mechanism in dplyr 관련되어 이해

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

을,하지만 난 그것을 고정되지 않습니다.

미리 도움을 주셔서 감사합니다.

답변

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