首先,完全披露。我試圖嚴格在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
字段導致的額外維度。任何幫助將非常感激。
你有沒有嘗試從你在鏈接工作的答案確切的'ddply'代碼?沒有工作嗎?它適用於我(但我沒有你的數據集)。對單列使用'ddply'的另一種方法是'ddply(dat1,。(rep),summarize,rollamt = rollmean12(amt))'。 – aosmith
關閉。不幸的是,我需要將數據添加回原始數據集中,所以'summarize'調用會刪除週期日期。我意識到這個要求沒有在我的原始文章中指定。我找到了一個消除「ddply」呼叫的好方法。請參閱下面的答案。 – Jeremy