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

在“日期”列中,年份除以接下来的月份 - 3 月、6 月、9 月和 12 月。我需要将 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 日、2011 年 6 月 1 日、2012 年 3 月 1 日):“x”必须是数字

谢谢!

4

2 回答 2

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

所以现在按 FY_Q 和 Country 进行 tapply 或聚合:

> 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

请参阅:将日期时间格式化为 R 中的季节?对于有点类似的问题和解决方案。

于 2014-11-01T00:45:54.443 回答
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)))
于 2014-11-01T01:36:49.293 回答