2016-10-19 4 views
-2

나는 가중치가 필요한 시계열 데이터를 집계하는 데 도움이되는 함수를 만들고 있습니다. 이 함수는 간격 수준 데이터를 취하여 일별, 주별, 월별, 분기 별 또는 연간 수준으로 집계 할 수 있어야합니다. 아래 코드는 함수에서 제거 될 때 적절한 출력을 가진 xts 객체를 생성하지만 함수는 그렇지 않습니다. 나는 (내 문제가 촬영을 돕기 위해 추가 인쇄 호출로) 아래의 기능을 만들었습니다 NextMethod에서함수 내에 객체 길이가 0이지만 외부에 0이 아닌 이유는 무엇입니까?

오류 (:

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] 객체의 길이와 일치하지 않음

인쇄 호출은 각 열의 길이가 동일하고 rownames의 동일한 수 (색인 생성) 및 개체 아직 동물원/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

매우 빠른 투표였습니다. 질문을 더 잘하기 위해 내가 할 수있는 것을 설명해주십시오. 고맙습니다! –

답변

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 

하려면 : 내가 선을 변경 위의 코드에서 y를 $의 이전 호출이 존재하지 않는 개체를 참조 처리하기 때문에

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

이 오류를 극복했다. 이는 함수 내에서 일관된 이름 지정을 보장하여 함수가 제대로 작동 할 수 있도록합니다.