0

我有一个框架,其中包括一个日期列(确实是 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

我知道我可以为每个计算使用整个系列的子集,但我也知道如果我更聪明......也许可以轻点?......我可以把它翻出来。我需要添加一个库来处理这样的日期吗?

4

1 回答 1

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
于 2012-11-29T20:37:26.180 回答