1

一是充分披露。我试图在 MS Access 中使用相关子查询严格执行此操作,并在此帖子12 个月移动平均值(按人)上获得了一些帮助,日期。我最初认为我的数据足够小,可以通过,但它太糟糕了。作为替代方案,我将尝试在 R 中运行它,然后将结果写入 MS Access 中的新表。我有数据,因此我有以下字段:

rep, cyc_date, amt

按照 Andrie 的 5 年滚动周期(而不是 5 年平均值)的链接示例R:计算面板数据中的 5 年平均值,我试图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.

我不确定为什么会这样。我需要显式转换datazoo对象吗?如果是这样,不确定如何处理由该person_id字段产生的额外维度。任何帮助将不胜感激。

4

3 回答 3

3

我在以下帖子中找到了此代码:在 R 中按组应用滚动平均值

data$movavg <- ave(data$amt, data$rep, FUN = function(x) rollmean(x, k=12, align="right", na.pad=T)).

ave节省一天!

于 2013-10-11T18:50:16.807 回答
0

只是一些提示,因为我根本不使用时间序列:ddply需要数据框输入,所以不要将其转换为zoo对象。 .(data$rep)我认为应该是公正.(rep)的,rollmean12不应该用参数来调用。相反,您应该重新编写函数以提取所需的列。所以,大约是这样的:

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

如果您这样做?ddply,则有一个指向 JSS 中非常有用的出版物的链接。

于 2013-10-11T17:36:29.727 回答
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
  ) 
于 2019-03-28T12:57:55.903 回答