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