2016-10-19 7 views
-2

私は、時系列データを集計するための関数に取り組んでいます。その中のいくつかは重み付けが必要です。この関数は、間隔レベルのデータを集計し、毎日、毎週、毎月、四半期、または毎年のレベルに集計できる必要があります。以下のコードは、関数から取り除かれると、期待される出力を生成し、xtsオブジェクトは適切な計算を行いますが、関数は出力しません。私は(私のトラブルシューティングを支援するために追加の印刷呼び出しで)以下の機能を作成しました:にNextMethodでなぜ関数内にオブジェクト長ゼロが作成されますが、外側にはありませんか?

エラー(:

agg_cc_xts = function(x, aht, sl, asa, handled, rcvd, period = c("daily", 
                   "weekly", 
                   "monthly", 
                   "quarterly", 
                   "yearly")){ 

     x$wkld = x[,handled] * x[,aht] 
     x$sl_thresh = x[,rcvd] * x[,sl] 
     x$asa_calc = x[,handled] * x[,asa]  
     if(period == "daily"){ 
       a = apply.daily(x[,rcvd], sum, na.rm = TRUE) 
       b = apply.daily(x[,handled], sum, na.rm = TRUE) 
       c = apply.daily(x$wkld, sum, na.rm = TRUE) 
       d = apply.daily(x$sl_thresh, sum, na.rm = TRUE) 
       e = apply.daily(x$asa_calc, sum, na.rm = TRUE) 
     } else { 
       if(period == "monthly"){ 
         a = apply.monthly(x[,rcvd], sum, na.rm = TRUE) 
         b = apply.monthly(x[,handled], sum, na.rm = TRUE) 
         c = apply.monthly(x$wkld, sum, na.rm = TRUE) 
         d = apply.monthly(x$sl_thresh, sum, na.rm = TRUE) 
         e = apply.monthly(x$asa_calc, sum, na.rm = TRUE) 
       } else { 
         if(period == "quarterly"){ 
           a = apply.quarterly(x[,rcvd], sum, na.rm = TRUE) 
           b = apply.quarterly(x[,handled], sum, na.rm = TRUE) 
           c = apply.quarterly(x$wkld, sum, na.rm = TRUE) 
           d = apply.quarterly(x$sl_thresh, sum, na.rm = TRUE) 
           e = apply.quarterly(x$asa_calc, sum, na.rm = TRUE) 
         } else { 
           if(period == "yearly"){ 
             a = apply.yearly(x[,rcvd], sum, na.rm = TRUE) 
             b = apply.yearly(x[,handled], sum, na.rm = TRUE) 
             c = apply.yearly(x$wkld, sum, na.rm = TRUE) 
             d = apply.yearly(x$sl_thresh, sum, na.rm = TRUE) 
             e = apply.yearly(x$asa_calc, sum, na.rm = TRUE) 
           } else { 
             if(period == "weekly"){ 
               a = apply.weekly(x[,rcvd], sum, na.rm = TRUE) 
               b = apply.weekly(x[,handled], sum, na.rm = TRUE) 
               c = apply.weekly(x$wkld, sum, na.rm = TRUE) 
               d = apply.weekly(x$sl_thresh, sum, na.rm = TRUE) 
               e = apply.weekly(x$asa_calc, sum, na.rm = TRUE) 
             } 
           } 
         } 
       } 
     } 
     print(paste(length(a), class(a), length(.index(a)))) 
     print(paste(length(b), class(b), length(.index(b)))) 
     print(paste(length(c), class(c), length(.index(c)))) 
     print(paste(length(d), class(d), length(.index(d)))) 
     print(paste(length(e), class(e), length(.index(e)))) 
     print(head(a)) 
     print(head(b)) 
     print(head(c)) 
     print(head(d)) 
     print(head(e)) 
     y = cbind.xts(a, b, c, d, e) 
     y$aht = y$wkld/y$handled 
     y$sl = y$sl_thresh/y$rcvd 
     y$asa = y$asa_calc/y$handled 
     drops = c("wkld", "sl_thresh", "asa_calc") 
     y = y[, !(names(y) %in% drops)] 
     return(y) 
} 

私が作成したデータセットにそれを実行すると、私はエラーを取得します。 dims [product 274]オブジェクトの長さに一致しません。

印刷呼び出しでは、各列の長さが同じで、同じ数の索引付け(索引付け)があり、オブジェクトまだ動物園/ xtsです。

私は下のサンプルデータでこれを実行している:私は答えられるために重要であると信じて質問がある

library(xts) 

set.seed(12822) 
dates = seq(as.Date("2016-01-01"), 
      as.Date("2016-09-30"), by="days") 
RECEIVED = rnorm(n = length(dates), mean = 8000, sd = 650) 
AHT = rnorm(n = length(dates), mean = 650, sd = 15) 
HANDLED = RECEIVED - rnorm(n = length(dates), mean = 240, sd = 24) 
SL = rnorm(n = length(dates), mean = .75, sd = .25/3.1) 
ASA = rnorm(n = length(dates), mean = 46, sd = 13) 
df = cbind(dates, RECEIVED, HANDLED, AHT, SL, ASA) 
#make sure to use as.xts as the xts() call is used to make NEW xts objects 
a.xts = as.xts(df[, -1], order.by = dates) 

set.seed(2) 
dates = seq(as.Date("2016-01-01"), 
      as.Date("2016-09-30"), by="days") 
RECEIVED = rnorm(n = length(dates), mean = 4500, sd = 300) 
AHT = rnorm(n = length(dates), mean = 700, sd = 20) 
HANDLED = RECEIVED - rnorm(n = length(dates), mean = 135, sd = 13.5) 
SL = rnorm(n = length(dates), mean = .65, sd = .30/3.1) 
ASA = rnorm(n = length(dates), mean = 60, sd = 17) 
df = cbind(dates, RECEIVED, HANDLED, AHT, SL, ASA) 

b.xts = as.xts(df[, -1], order.by = dates) 

all = rbind(a.xts, b.xts) 

関数内で長さゼロのこのオブジェクトを生成していますか? このコードをコンソール内ではなく関数内で実行すると、なぜ生成されますか? この動作を回避または防止するにはどうすればよいですか?

+0

これは非常に迅速な投票でした。質問をより良くするために私ができることを説明してください。ありがとうございました! –

答えて

0

この問題の問題は、エラーコードが私に信じられるようになったため、cbindのマージには関係しませんでした。むしろ、関数内の異なる行列内の命名規則の問題でした。私は以前、以下の質問に対する答えの助けを借りて、データフレームの名前を関数に渡すという問題を解決しました。

Pass a data.frame column name to a function

しかし、私は、データフレームの名前はそれでオーバー氾濫することを認識しませんでした。

y$aht = y$wkld/y$handled 
    y$sl = y$sl_thresh/y$rcvd 
    y$asa = y$asa_calc/y$handled 

:I上記のコードの行を変更取り扱うY $の前の呼び出しが存在しないオブジェクトを参照するため

y$aht = y$wkld/y[, handled] 
    y$sl = y$sl_thresh/y[, rcvd] 
    y$asa = y$asa_calc/y[, handled] 

これは、エラーを克服しました。これは、関数内での一貫した命名を保証し、関数が正しく機能するようにする必要があることを強調します。