2014-10-31 2 views
0

У меня есть следующая таблица:Как рассчитать Mean по дате сгруппированной в качестве фискального Quarters

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 

В колонке «Дата» года разделены на следующие месяцы - март, июнь, сентябрь и декабрь. Мне нужно сгруппировать месяцы с июня по март в качестве Финансового года и в каждый финансовый год рассчитать среднее значение столбца «Значение» по «Страна» и «Класс». Может ли кто-нибудь помочь мне сделать это?

Я пытаюсь сделать это с помощью 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 (период, список (6/1/2010, 3/1/2011, 6/1/2011, 3/1/2012,: «х» должно быть числовым

Спасибо

+0

Я уверен, что это было предложено и ответить, прежде чем ... что поиск вы сделали? –

+0

Итак, январь-1-2010 должен быть в 2010 финансовом году или в 2009 финансовом году? –

+0

Проблема с вашим подходом заключается в том, что для типа данных, который вы создаете, нет функции cut(). Это будут персонажи, если они не разобраны как разделение. Обратите внимание, что список (6/1/2010) возвращает десятичную дробь. Это не R Даты. Также в поле данных нет столбца «Период». –

ответ

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] 
!

Это то вставит FY с четверть сдвинуты на 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

0

Try:

> 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

Вы не используете FY, который начинается в июне или июле или независимо от того, что спрашивает OP. –

Смежные вопросы