根据季节更改数据框中的年份变量

时间:2013-03-16 17:23:28

标签: r

我有一个如下所示的数据框:

set.seed(50)
df <- data.frame(Month=c(sort(sample(1:12, 10)),
                         sort(sample(1:12, 10)),
                         sort(sample(1:12, 10))),
                 Year=c(rep(2007, 10), 
                        rep(2010, 10), 
                        rep(2011, 10))) 

df的负责人:

  Month Year
1     1 2007
2     3 2007
3     4 2007
4     5 2007
5     6 2007
6     7 2007

我需要根据季节重新编码年份变量,例如,如果月份是1月份,而年份是2013年,那么年份应该重新编码为2012/2013。对于1月至6月,年份应记录为2012/2013年,7月至12月应记录为2013/2014。

因此,

df应记录如下。请注意,有些月份缺失,有些年份不见了:

set.seed(50)
df <- data.frame(Month=c(sort(sample(1:12, 10)),
                         sort(sample(1:12, 10)),
                         sort(sample(1:12, 10))),
                 Year=c(rep(2007, 10), 
                        rep(2010, 10), 
                        rep(2011, 10)),                   
                 Year.Seasonal=c(rep('2006/2007', 5),
                                 rep('2007/2008', 5),
                                 rep('2009/2010', 6),
                                 rep('2010/2011', 9),
                                 rep('2011/2012', 5)))

重新编码的df负责人:

  Month Year Year.Seasonal
1     1 2007     2006/2007
2     3 2007     2006/2007
3     4 2007     2006/2007
4     5 2007     2006/2007
5     6 2007     2006/2007
6     7 2007     2007/2008

这样做的最佳方式是什么?

2 个答案:

答案 0 :(得分:4)

df <- within(df,season <- paste(Year - (Month <= 6),
                                Year + (Month > 6),sep="/"))
head(df)
  Month Year    season
1     1 2007 2006/2007
2     3 2007 2006/2007
3     4 2007 2006/2007
4     5 2007 2006/2007
5     6 2007 2006/2007
6     7 2007 2007/2008

答案 1 :(得分:2)

以下是使用ifelse()的解决方案 - 如果Month小于7,那么这将是上一季,如果不是,那么下一季。函数paste()将汇总多年。

df$Year.Seasonal<-ifelse(df$Month<7,
     paste(df$Year-1,df$Year,sep="/"),paste(df$Year,df$Year+1,sep="/"))

> head(df)
  Month Year Year.Seasonal
1     1 2007     2006/2007
2     3 2007     2006/2007
3     4 2007     2006/2007
4     5 2007     2006/2007
5     6 2007     2006/2007
6     7 2007     2007/2008