2013-10-11 94 views
0

首先,完全披露。我試圖嚴格在MS Access中使用相關的子查詢來做到這一點,並且在這篇文章12 month moving average by person, date上有一些幫助。我原本以爲我的數據會小到可以突破,但這太糟糕了。作爲替代方法,我將嘗試在R中運行此操作,然後將結果寫入MS Access中的新表。我有這樣的,我有以下字段的數據:R - 計算面板數據的12個月移動平均線

rep, cyc_date, amt 

繼聯例如通過Andrie用於滾動軸承5年期(而不是5年平均值)R: Calculating 5 year averages in panel data,我試圖讓滾動12 amt字段的月平均值爲rep。這裏是我的代碼:

library(zoo) 
library(plyr) 
library(RODBC) 

# Pull data from local MS Access database. The referenced sqlFetch is a query 
# that pulls the data, ordered by `rep`, then `cyc_date` 

channel <- odbcConnectAccess2007("C://MyDB.accdb") 
data <- data.frame(sqlFetch(channel, "MyView")) 

# Ensure coercion of `cyc_date` to date type 
data$cyc_date <- as.Date(data$cyc_date) 

# Function (take from post above) 
rollmean12 <- function(x) { 
       rollmean(x, 12) 
       } 
# Calculate rolling average by person 
rollvec <- ddply(data, .(data$rep), rollmean12(data$amt)) 

不幸的是,這是行不通的。我收到以下錯誤:

Error in llply(.data = .data, .fun = .fun, ..., .progress = .progress, : 
.fun is not a function. 

我不知道爲什麼會發生這種情況。我是否需要將data明確轉換爲zoo對象?如果是這樣,不知道如何處理由person_id字段導致的額外維度。任何幫助將非常感激。

+0

你有沒有嘗試從你在鏈接工作的答案確切的'ddply'代碼?沒有工作嗎?它適用於我(但我沒有你的數據集)。對單列使用'ddply'的另一種方法是'ddply(dat1,。(rep),summarize,rollamt = rollmean12(amt))'。 – aosmith

+0

關閉。不幸的是,我需要將數據添加回原始數據集中,所以'summarize'調用會刪除週期日期。我意識到這個要求沒有在我的原始文章中指定。我找到了一個消除「ddply」呼叫的好方法。請參閱下面的答案。 – Jeremy

回答

0

只是一些提示,因爲我根本不用時間序列:ddply需要數據幀輸入,所以不要將它轉換爲zoo對象。 .(data$rep)我認爲應該只是.(rep)rollmean12不應該用參數調用。相反,你應該重新編寫函數來提取你想要的列。因此,大約是這樣的:

rollmean12 <- function(x) rollmean(x$amt, 12) 

如果你?ddply存在於JSS一個非常有益的出版物的鏈接。