首先,全面披露。我试图在具有相关子查询的MS Access中严格执行此操作,并在此帖12 month moving average by person, date上获得了一些帮助。我原本以为我的数据足够小,可以通过,但很糟糕。作为替代方案,我将尝试在R中运行它,然后将结果写入MS Access中的新表。我有数据,以便我有以下字段:
rep, cyc_date, amt
按照Andrie连续5年(与5年平均值相对)R: Calculating 5 year averages in panel data相关联的示例,我试图通过{amt
字段滚动12个月的平均值{1}}。这是我的代码:
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
字段产生的额外维度。非常感谢任何帮助。
答案 0 :(得分:2)
我在以下帖子中找到了此代码:applying rolling mean by group in R
data$movavg <- ave(data$amt, data$rep, FUN = function(x) rollmean(x, k=12, align="right", na.pad=T)).
ave
可以节省一天的时间!
答案 1 :(得分:0)
只是一些提示,因为我根本不使用时间序列:ddply
需要数据框输入,因此不要将其转换为zoo
对象。 .(data$rep)
我认为应该只是.(rep)
,并且不应该使用参数调用rollmean12
。相反,您应该重新编写函数以提取所需的列。所以,大概是这样的:
rollmean12 <- function(x) rollmean(x$amt, 12)
如果您执行?ddply
,则可以链接到JSS中非常有用的出版物。
答案 2 :(得分:0)
尝试使用tidyquant
库
x %>% tq_mutate(
# tq_mutate args
select = amt,
mutate_fun = rollapply,
col_rename = "rollmean12", ####
# rollapply args
width = 12,
align = "right",
FUN = mean,
# mean args
na.rm = TRUE
)