2014-10-31 52 views
0

我有如下表:如何通過歸類爲財政季度日期來計算平均

Date  Country Class Value 
6/1/2010 USA  A  45 
6/1/2010 Canada A  23 
6/1/2010 Brazil B  65 
9/1/2010 USA  B  47 
9/1/2010 Canada A  98 
9/1/2010 Brazil B  25 
12/1/2010 USA  B  14 
12/1/2010 Canada A  79 
12/1/2010 Brazil A  23 
3/1/2011 USA  A  84 
3/1/2011 Canada B  77 
3/1/2011 Brazil A  43 
6/1/2011 USA  A  45 
6/1/2011 Canada A  23 
6/1/2011 Brazil B  65 
9/1/2011 USA  B  47 
9/1/2011 Canada A  98 
9/1/2011 Brazil B  25 
12/1/2011 USA  B  14 
12/1/2011 Canada A  79 
12/1/2011 Brazil A  23 
3/1/2012 USA  A  84 
3/1/2012 Canada B  77 
3/1/2012 Brazil A  43 

在列「日期」年通過接下來的幾個月劃分 - 三月,六月,九月和十二月。我需要將從6月到3月的月份分組爲一個會計年度,並按各會計年度計算「國家」和「類別」列的「價值」的平均值。有人能幫我做到嗎?

我試圖做到這一點使用data.table但得到的錯誤:

d=data[,list(Val=mean(Value,na.rm=T)),by=list(Country,Class, 
    Period.grp=cut(Period,list(6/1/2010,3/1/2011,6/1/2011,3/1/2012, 
    6/1/2012,3/1/2013,6/1/2013,3/1/2014)))] 

錯誤cut.default(期間,列表(2010/6/1,2011/3/1,6/1/2011,2012/3/1,: 「X」必須是數字

謝謝

+0

我敢肯定,這已被要求,並...你做了什麼搜索之前回答? – 2014-11-01 00:37:58

+0

那麼2010年1月或2010年1月的2010年應該如何呢? – 2014-11-01 00:59:06

+0

您的方法存在的問題是,您正在創建的數據類型沒有cut()函數。如果他們沒有被解析爲分區,那麼這些將成爲角色。請注意,列表(2010年6月1日)返回小數部分。那些不是R日期。在數據框中也沒有'Period'列。 – 2014-11-01 04:14:17

回答

1

我發現我在想我寫的答案,但它實際上是不同的一點

# this should "shift" the year calculation 3 months and provide quarter 
c('Q1','Q2','Q3','Q4')[ 1+((as.POSIXlt(dates)$mon+3) %/% 3)%%4] 

這則貼與季風雲轉移6個月,但你可能需要調整,因爲你一年規格是含糊不清的「命名的一年」:

dat$FY_Q <- paste(1900+as.POSIXlt(dat$dates)$year+ 
         1*(as.POSIXlt(dat$dates)$mon %in% 7:12) , 
    c('Q1','Q2','Q3','Q4')[ 1+((as.POSIXlt(dat$dates)$mon-6) %/% 3)%%4] 
    , sep="-") 

dat 
     Date Country Class Value  dates FY_Q 
1 6/1/2010  USA  A 45 2010-06-01 2010-Q4 
2 6/1/2010 Canada  A 23 2010-06-01 2010-Q4 
3 6/1/2010 Brazil  B 65 2010-06-01 2010-Q4 
4 9/1/2010  USA  B 47 2010-09-01 2011-Q1 
5 9/1/2010 Canada  A 98 2010-09-01 2011-Q1 
6 9/1/2010 Brazil  B 25 2010-09-01 2011-Q1 
snipped--------- 

所以現在做一個tapply或聚集通過FY_Q和國家:

> with(dat, aggregate(Value, list(FY_Q, Country),FUN=mean) ) 
    Group.1 Group.2 x 
1 2010-Q4 Brazil 65 
2 2011-Q1 Brazil 25 
3 2011-Q2 Brazil 23 
4 2011-Q3 Brazil 43 
5 2011-Q4 Brazil 65 
6 2012-Q1 Brazil 25 
7 2012-Q2 Brazil 23 
8 2012-Q3 Brazil 43 
9 2010-Q4 Canada 23 
10 2011-Q1 Canada 98 
11 2011-Q2 Canada 79 
12 2011-Q3 Canada 77 
13 2011-Q4 Canada 23 
14 2012-Q1 Canada 98 
15 2012-Q2 Canada 79 
16 2012-Q3 Canada 77 
17 2010-Q4  USA 45 
18 2011-Q1  USA 47 
19 2011-Q2  USA 14 
20 2011-Q3  USA 84 
21 2011-Q4  USA 45 
22 2012-Q1  USA 47 
23 2012-Q2  USA 14 
24 2012-Q3  USA 84 

請參閱:Format date-time as seasons in R?對於有點類似的問題和解決方案。

+0

謝謝!我在問題中加入了我的方法。你可以幫助用data.table做到這一點嗎? – user45415631 2014-11-01 02:31:54

0

嘗試:

> dat$fiscal = rep(2011:2015,each=12, length.out=nrow(dat)) 
> 
> aggregate(Value~Country+Class+fiscal, data=dat, mean) 
    Country Class fiscal Value 
1 Brazil  A 2011 33.00000 
2 Canada  A 2011 66.66667 
3  USA  A 2011 64.50000 
4 Brazil  B 2011 45.00000 
5 Canada  B 2011 77.00000 
6  USA  B 2011 30.50000 
7 Brazil  A 2012 33.00000 
8 Canada  A 2012 66.66667 
9  USA  A 2012 64.50000 
10 Brazil  B 2012 45.00000 
11 Canada  B 2012 77.00000 
12  USA  B 2012 30.50000 

2011財年等:

dat$fiscal = paste0('FY',rep(2011:2015,each=12, length.out=nrow(dat))) 
+0

你並沒有使用6月或7月開始的財政年度,也沒有使用OP所要求的財政年度。 – 2014-11-01 02:11:13