2012-10-18 3 views
3

vectorised 함수가 for-loops보다 나은 이유를 알게되었습니다.timeseries 집계시 for-loops 방지

그러나 벡터화 된 함수 프로그래밍 솔루션을 볼 수없는 몇 가지 문제가 있습니다. 그 중 하나는 매월 데이터를 합산하여 분기 별 데이터를 얻는 것입니다. 이 코드를 대체 할 제안 사항 ...

month <- 1:100 
A422072L <- c(rep(NA, 4), rnorm(96, 100, 5)) + 2 * month 
A422070J <- c(NA, NA, rnorm(96, 100, 5), NA, NA) + 2 * month 
Au.approvals <- data.frame(month=month, A422072L=A422072L, A422070J=A422070J) 

Au.approvals$trend.sum.A422072L.qtr <- NA 
Au.approvals$sa.sum.A422070J.qtr <- NA 
for(i in seq_len(nrow(Au.approvals))) 
{ 
    if(i < 3) next 
    if(all(!is.na(Au.approvals$A422072L[(i-2):i]))) 
     Au.approvals$trend.sum.A422072L.qtr[i] <- sum(Au.approvals$A422072L[(i-2):i]) 
    if(all(!is.na(Au.approvals$A422070J[(i-2):i]))) 
     Au.approvals$sa.sum.A422070J.qtr[i] <- sum(Au.approvals$A422070J[(i-2):i]) 
} 

print(Au.approvals) 

예제로 실행할 충분한 데이터가 있습니다.

+0

재현 가능한 예를 제공하십시오. 당신은 아마도'ddply','aggregate','ave' 등을 보길 원할 것입니다. –

답변

4

의 일부 가짜 시계열을 만들어 보자 :

time_dat = data.frame(t = 1:100, value = runif(100)) 

가, 동물원 패키지에서 rollapply에서 봐 주시기 바랍니다 롤링 합계를 얻으려면 : 여기

require(zoo) 
time_dat = transform(time_dat, 
        roll_value = rollapply(value, 10, sum, fill = TRUE)) 

나는 가정 거친 해상도 (분기 별 그)는 정밀한 해상도보다 10 배 더 거칩니다. 비 롤링 평균에 대한


원래 대답은 :

나는 plyr 패키지에서 기능을 사용하려면,하지만 ave, aggregatedata.table도 좋은 옵션입니다. 대형 데이터 세트의 경우 data.table이 빠르다.

먼저 더 거친 시간 주파수를 지정하는 추가 열을 생성, 즉 분기에 관측이다 : 그러나 다시 몇 가지 plyr 마법에 도착

time_dat[["coarse_t"]] = rep(1:10, each = 10) 
> head(time_dat) 
    t  value coarse_t 
1 1 0.9045097  1 
2 2 0.4174182  1 
3 3 0.5638139  1 
4 4 0.8228698  1 
5 5 0.7059027  1 
6 6 0.5285386  1 

이제 우리는 거친 시간을 time_dat를 집계 할 수 있습니다 주파수 :

time_dat_coarse = ddply(time_dat, .(coarse_t), summarise, sum_value = sum(value)) 
> time_dat_coarse 
    coarse_t sum_value 
1   1 6.097348 
2   2 4.834720 
3   3 3.988809 
4   4 4.170656 
5   5 4.538269 
6   6 6.198716 
7   7 4.399282 
8   8 5.507384 
9   9 6.089072 
10  10 4.663287 

+0

고마워요.하지만 매월 회전하는 분기 별 금액을 원합니다. –

+0

@MarktheGraph'rollapply'를보세요. 내 대답의 연장. –

+0

덕분에 도움이되었습니다. Au.approvals <- transform (Au.approvals, trend = rollapply (A422072L, 3, sum, fill = NA, align = "right")) Au.approvals <- transform Au.approvals, sa = rollapply (A422070J, 3, sum, fill = NA, align = "right")) –

1

바울의 대답은 잘했지만, 난 그냥 역대 패키지는 많은 훌륭한 작업을 가지고 추가하고 싶었

library("chron") 
# chron uses chron-specific object representation. 
# If a different representation is needed, a conversion is necessary 
# eg. if a$date is a chron date object, I would us as.POSIXct(a$date) to get a POSIXct representation 

# create chron date objects and values 
a<-data.frame(date=as.chron(Sys.Date() + 1:1000), value = 1:100*runif(100,0,1)) 

# cuts dates into 15 intervals 
a$interval1<-cut(a$date,15) 
# cuts dates into 10 number of intervals using a label you define 
a$interval2<-cut(a$date,10,paste("group",1:10)) 
# cuts dates into weeks 
a$weeks<-cut(a$date,"weeks",start.on.monday=FALSE) 
# cuts dates into months 
a$months<-cut(a$date,"months") 
# cuts dates into years 
a$years<-cut(a$date,"years") 
# classifies day based on day of week 
a$day_of_week<-day.of.week(a$date) 

# creating a chron time object 
b<-data.frame(day_time=as.chron(Sys.time()+1:1000*100), value = 1:100*runif(100,0,1)) 
# cuts times into days - note: uses first time period as the start 
b$day<-cut(b$day_time,"days") 
# truncates time to 5 minute interval 
b$min_5<-trunc(b$day_time, "00:05:00") 
# truncates time to 1 hour intervals 
b$hour1<-trunc(b$day_time, "01:00:00") 
# truncates datetime to 1 hour and 2 second intervals 
b$days_3<-trunc(b$day_time, "01:00:02") 

집계

에 대한 plyr와 결합 할 수 날짜/시간 분류의 나는 대하은 시간 집계를 훨씬 쉽게하기 때문에 많이 사용합니다.

동물원 및 xts 패키지에는 더 많은 기능이있어 하루 단위의 세부 사항을 초과하는 다양한 집계에 유용합니다. 그들의 문서는 거대하고 원하는 것을 찾기가 어려울 수 있지만, 원하는 모든 것을 모두 찾을 수 있습니다. 주요 내용 :

library("zoo") 
library("xts") 
?rollapply 
?rollsum 
?rollmean 
?rollmedian 
?rollmax 
?yearmon 
?yearqtr 
?apply.daily 
?apply.weekly 
?apply.monthly 
?apply.quarterly 
?apply.yearly 
?to.minutes 
?to.minutes3 
?to.minutes5 
?to.minutes10 
?to.minutes15 
?to.minutes30 
?to.hourly 
?to.daily 
?to.weekly 
?to.monthly 
?to.quarterly 
?to.yearly 
?to.period 
관련 문제