按年计算数十年的数据

时间:2014-04-25 23:13:12

标签: r dataframe

我有一个包含20年月度数据的数据框:

year    month   value
1960    January  925
1960    February 903
1960    March    1006
    ...
1969    December 892
1970    January  990
1970    February 866
    ...
1979    December 120

我想创建一个数据框,在这里我总结每个十年的总数,按月计算:

year        month    value
decade_60s  January  4012
decade_60s  February 8678
decade_60s  March    9317
    ...
decade_60s  December 3995
decade_70s  January  8005
decade_70s  February 9112
    ...
decade_70s  December 325

我一直关注aggregate功能,但这似乎不是正确的选择。
我使用which函数看了一些仔细的子集,但这很快就变得太乱了。

对于这类问题,什么是正确的方法?我是否需要在某个时候使用apply,如果是,请如何使用?

我觉得使用for循环增长的诱惑,但我不认为这将是提高我的技能的最好方法..

感谢您的建议。

PS:month值是一个序数因子,如果这很重要。

2 个答案:

答案 0 :(得分:1)

聚合是一种使用基础R

的方法

首先定义十年

yourdata$decade <- cut(yourdata$year, breaks=c(1960,1970,1980), labels=c(60,70), 
                                           include.lowest=TRUE, right=FALSE)

然后汇总数据

aggregate(value ~ decade + month, data=yourdata , sum) 

然后命令获得所需的输出

答案 1 :(得分:1)

plyr&#39; count + gsub绝对是您的朋友:

library(plyr)

dat <- structure(list(year = c(1960L, 1960L, 1960L, 1969L, 1970L, 1970L, 1979L),
                      month = structure(c(3L, 2L, 4L, 1L, 3L, 2L, 1L), 
                      .Label = c("December", "February", "January", "March"), 
                      class = "factor"), 
                      value = c(925L, 903L, 1006L, 892L, 990L, 866L, 120L)), 
                      .Names = c("year", "month", "value"), 
                      class = "data.frame", row.names = c(NA, -7L))

dat$decade <- gsub("[0-9]$", "0", dat$year)

count(dat, .(decade, month), wt_var=.(value))
##  decade    month freq
## 1   1960 December  892
## 2   1960 February  903
## 3   1960  January  925
## 4   1960    March 1006
## 5   1970 December  120
## 6   1970 February  866
## 7   1970  January  990