2014-07-08 4 views
-1

다음 재현 가능한 샘플 데이터와 비슷한 거대한 데이터 세트가 있습니다.일일 레벨 데이터를 주간 레벨로 집계 R

Interval value 
1 2012-06-10 552 
2 2012-06-11 4850 
3 2012-06-12 4642 
4 2012-06-13 4132 
5 2012-06-14 4190 
6 2012-06-15 4186 
7 2012-06-16 1139 
8 2012-06-17 490 
9 2012-06-18 5156 
10 2012-06-19 4430 
11 2012-06-20 4447 
12 2012-06-21 4256 
13 2012-06-22 3856 
14 2012-06-23 1163 
15 2012-06-24 564 
16 2012-06-25 4866 
17 2012-06-26 4421 
18 2012-06-27 4206 
19 2012-06-28 4272 
20 2012-06-29 3993 
21 2012-06-30 1211 
22 2012-07-01 698 
23 2012-07-02 5770 
24 2012-07-03 5103 
25 2012-07-04 775 
26 2012-07-05 5140 
27 2012-07-06 4868 
28 2012-07-07 1225 
29 2012-07-08 671 
30 2012-07-09 5726 
31 2012-07-10 5176 

나는 다음과 같은 출력을 얻을 수 주간 레벨이 데이터를 집계 할 :

Interval   value 
1 Week 2, June 2012 *aggregate value for day 10 to day 14 of June 2012* 
2 Week 3, June 2012 *aggregate value for day 15 to day 21 of June 2012* 
3 Week 4, June 2012 *aggregate value for day 22 to day 28 of June 2012* 
4 Week 5, June 2012 *aggregate value for day 29 to day 30 of June 2012* 
5 Week 1, July 2012 *aggregate value for day 1 to day 7 of July 2012* 
6 Week 2, July 2012 *aggregate value for day 8 to day 10 of July 2012* 

가 어떻게 긴 코드를 작성하지 않고이 문제를 쉽게 달성 할을?

+0

당신은 [XTS] 태그를 사용하지만, 당신이 XTS 개체가처럼은 보이지 않는다. xts가 아마도 이것을 수행하는 가장 간단한 방법 일지라도 당신 말이 맞습니다. 전혀 검색 했습니까? 'to.weekly','apply.weekly','period.apply'를보고 SO를 검색하십시오. – GSee

답변

2

weeklubridate에서 얻으려면 by으로 5 주만 남습니다.

> library(lubridate) 
> do.call(rbind, by(dat$value, week(dat$Interval), summary)) 
# Min. 1st Qu. Median Mean 3rd Qu. Max. 
# 24 552 4146 4188 3759 4529 4850 
# 25 490 2498 4256 3396 4438 5156 
# 26 564 2578 4206 3355 4346 4866 
# 27 698  993 4868 3366 5122 5770 
# 28 671 1086 3200 3200 5314 5726 

이 올해의 28 주를 통해 24 일에 대한 요약 정보를 보여줍니다 dat이 데이터를 가정합니다. 당신이 값을 "집합"말할 때 마찬가지로, 우리가

> aggregate(value~week(Interval), data = dat, mean) 
# week(Interval) value 
# 1    24 3758.667 
# 2    25 3396.286 
# 3    26 3355.000 
# 4    27 3366.429 
# 5    28 3199.500 
0

aggregate와 수단을 얻을 수 있습니다, 당신은 자신의 합을 의미합니까? 당신이 일주일에 의해 '값'의의 합을 의미하는 경우의이 데이터 프레임이 d라고하자 d$Interval을 가정하는 클래스 Date입니다, 당신은 내가 데이터를 변환하는 것입니다 할 수있는 가장 쉬운 방법을 생각

# if d$Interval is not of class Date d$Interval <- as.Date(d$Interval) 
formatdate <- function(date) 
    paste0("Week ", as.numeric(format(date, "%d")) %/% 7 + 1, 
     ", ", format(date, "%b %Y")) 
# change "sum" to your required function 
aggregate(d$value, by = list(formatdate(d$Interval)), sum) 
#   Group.1  x 
# 1 Week 1, Jul 2012 3725.667 
# 2 Week 2, Jul 2012 3199.500 
# 3 Week 2, Jun 2012 3544.000 
# 4 Week 3, Jun 2012 3434.000 
# 5 Week 4, Jun 2012 3333.143 
# 6 Week 5, Jun 2012 3158.667 
10

을 시도 할 수 있습니다 GSEE으로 XTS 객체로 제안 : 당신이 데이터 프레임을 사용하는 경우

data <- as.xts(data$value,order.by=as.Date(data$interval)) 
weekly <- apply.weekly(data,sum) 

      [,1] 
2012-06-10 552 
2012-06-17 23629 
2012-06-24 23872 
2012-07-01 23667 
2012-07-08 23552 
2012-07-10 10902 

내가, 당신은 쉽게 tidyquant하여이 작업을 수행 할 수

+0

예측과 분해를 사용하기 위해 어떻게 ts() 객체로 전환 할 수 있습니까? – gmeroni

+0

"as"메소드를 사용하십시오 :'as.ts (data)' – hvollmeier

1

:-) 당신을위한 연습으로 출력의 서식을 떠나 패키지. 돌연변이를 적용하고 새 데이터 프레임을 반환하는 tq_transmute 함수를 사용하십시오. "값"열을 선택하고 xts 함수 apply.weekly을 적용하십시오. 추가 인수 FUN = sum은 주 단위로 집계됩니다.

library(tidyquant) 

df 
#> # A tibble: 31 x 2 
#>  Interval value 
#>  <date> <int> 
#> 1 2012-06-10 552 
#> 2 2012-06-11 4850 
#> 3 2012-06-12 4642 
#> 4 2012-06-13 4132 
#> 5 2012-06-14 4190 
#> 6 2012-06-15 4186 
#> 7 2012-06-16 1139 
#> 8 2012-06-17 490 
#> 9 2012-06-18 5156 
#> 10 2012-06-19 4430 
#> # ... with 21 more rows 

df %>% 
    tq_transmute(select  = value, 
       mutate_fun = apply.weekly, 
       FUN  = sum) 
#> # A tibble: 6 x 2 
#>  Interval value 
#>  <date> <int> 
#> 1 2012-06-10 552 
#> 2 2012-06-17 23629 
#> 3 2012-06-24 23872 
#> 4 2012-07-01 23667 
#> 5 2012-07-08 23552 
#> 6 2012-07-10 10902