2014-02-06 36 views
2

我想使用在實施例R.數據移動平均函數(rollmean)條件:輥的意思是基於R中

x<-seq(1,48,by=1) 
y<-c(rep(11,12), rep(12,12)) 
z<-data.frame(x,y) 

欲計算與3天滯後移動z[,"x"]的平均用於每個z[,"y"] (即11 & 12)並將它們填充到(新)第三列,其中每個z[,"y"]的前兩行由NAs指定。

+0

你有什麼試過?這可以幫助你http://stackoverflow.com/questions/17765001/using-rollmean-when-there-are-missing-values-na – Llopis

+0

任何理由使用'data.table'而不是數據框?爲什麼'y'比'x'短?我很確定你可以用'rollapply(x,widths = {與y做什麼},...)在一行中做到這一點'' –

回答

5

使用data.table包使用zoo例如:

library(zoo) 
library(data.table) 
DT <- data.table(z) 
DT[, roll_x := rollmeanr(x, 3, fill = NA), y] 

當然,如果有一些缺失值最好是使用rollapplyr

DT[, roll_x := rollapplyr(x, 3, mean, fill = NA), y] 

那將是更快的另一個包caTools

library(caTools) 
DT[, roll_x := runmean(x, 3, align = 'right', endrule = 'NA'), by = y] 

在這個數據幀爲單位工作過:

transform(z, roll_x = ave(x, y, FUN = function(x) rollmeanr(x, 3, fill = NA))) 
+0

對你們倆的問候) – Jack

+0

我很抱歉,爲什麼我得到了錯誤「Drop in &&!has.j錯誤:'x && y'」中的'x'類型在應用我的原始數據時無效 – Jack

+1

我發現'caTools'是迄今爲止最快的滾動方式包裝 – eddi

5

您可以使用基本功能filter

z[ , moving_average := filter(x, rep(1/3, 3), sides = 1), by = "y"] 

注意的3個結果在 NA秒的滯後。

+0

+1!使用'過濾器'總是具有挑戰性:) :) – agstudy

+0

哦,是的。我很着急,犯了兩個愚蠢的錯誤。我現在糾正它們。 – Jack

+0

我發現過濾器在與data.table結合使用時比rollmean更健壯 – grrothman