1

まず、完全開示。私は相関サブクエリを使用して MS Access で厳密にこれを実行しようとしましたが、この投稿12 か月移動平均 by person, dateでいくつかの助けがありました。私は当初、自分のデータが十分に小さいと思っていましたが、ひどいものです。別の方法として、これを R で実行してから、MS Access の新しいテーブルに結果を書き込んでみます。次のフィールドを持つようなデータがあります。

rep, cyc_date, amt

(5 年間の平均とは対照的に)ローリング5 年間の Andrie によるリンクされた例に従っ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フィールドから生じる余分な次元を処理する方法がわかりません。どんな助けでも大歓迎です。

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 に答える