我有一个如下所示的数据框:
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
这样做的最佳方式是什么?
答案 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