在R中进行多个日期计算的更有效方法?

时间:2012-11-29 20:28:21

标签: r date

我有一个框架,其中包含一个日期列(确实是类Date)和一个数字列(类Numeric)

       first       last       date number
1   Reynalda     Morley 1953-07-03      9
2     Annice     Meador 1954-10-29     38
3       Jude    Pertuit 1956-08-23     49
4    Viviana      Dance 1979-11-07     32
5    Lavonda      Babst 1982-02-06     17
6    Rachele Eisenhower 1985-11-12     27
7     Ericka     Roesch 1987-05-02     22
8   Giovanni      Bemis 1988-06-23     33
9      Ferne       Mone 2005-12-21     36
10 Anjanette   Eppinger 2010-01-03      4

我想每年走过一段时间,获得迄今为止的累计总数和一年中的平均值。粗略地说,我希望得到一个结果框架,如:

    year    total.to.date   average.this.year
1   2001    128     32
2   2002    128     0
3   2003    145     17
4   2004    227     27.3333333333333
5   2005    267     20

我知道我可以为每次计算使用一系列子集,但我也知道,如果我更聪明...也许是应用? ......我可以简单地说出来。我是否需要添加一个库来处理这样的日期?

1 个答案:

答案 0 :(得分:1)

它适用于by函数。

dat <- read.table(text="first       last       date number
1   Reynalda     Morley 1953-07-03      9
2     Annice     Meador 1954-10-29     38
3       Jude    Pertuit 1956-08-23     49
4    Viviana      Dance 1979-11-07     32
5    Lavonda      Babst 1982-02-06     17
6    Rachele Eisenhower 1985-11-12     27
7     Ericka     Roesch 1987-05-02     22
8   Giovanni      Bemis 1988-06-23     33
9      Ferne       Mone 2005-12-21     36
10 Anjanette   Eppinger 2010-01-03      4", header = TRUE)

dat$date <- as.Date(dat$date)

这些命令生成数据。累计总计使用cumsum函数计算:

result <- with(dat, by(number, format(date,"%Y"), function(x) c(mean(x),sum(x))))
result <- data.frame(names(result), do.call(rbind, result))
result <- setNames(cbind(result[-3], cumsum(result[3])),
                   c("year", "average.this.year", "total.to.date"))

result

   year average.this.year total.to.date
1  1953                 9             9
2  1954                38            47
3  1956                49            96
4  1979                32           128
5  1982                17           145
6  1985                27           172
7  1987                22           194
8  1988                33           227
9  2005                36           263
10 2010                 4           267