计算R中的相对累积和

时间:2014-12-07 04:25:41

标签: r cumsum

我的示例数据如下所示:

data <- read.table(text="group;  year;    val
               a;        1928;    20
               a;        1929;    50
               a;        1930;    40
               a;        1931;    45
               b;        1935;   -10
               b;        1936;   -15 ", sep=";", header=T, stringsAsFactors = FALSE)

> data
                 group year val
1                    a 1928  20
2                    a 1929  50
3                    a 1930  40
4                    a 1931  45
5                    b 1935 -10
6                    b 1936 -15

我想要做的是在新列sum_rel中计算相对于1930年的累积和(例如,1930年是开始年份,应该添加1930年以上的所有值,并且应减去1930年以下的值)。如果所有年份都大于1930年,则相对值(0 =)应为每组最低年份(如案例b)。

               group year  val sum_rel
               a     1927      -110
               a     1928  20  -90
               a     1929  50  -40
               a     1930  40    0
               a     1931  45   45
               b     1934      0
               b     1935 -10  -10
               b     1936 -15  -25

我查看了cumsum功能,但无法将其应用于群组,如果您能帮助我,我将非常高兴。

1 个答案:

答案 0 :(得分:1)

添加额外的行可能是最棘手的部分。这似乎产生了你之后的输出

do.call("rbind", unname(lapply(split(data, data$group), function(x) {
    x<-x[order(x$year),]
    cx <- c(which(x$year==1930),0)[1]+1
    cs <- cumsum(c(0, x$val))
    cbind(rbind(transform(x[1,], val=NA, year=min(x$year)-1), x), sum_rel=cs-cs[cx])
})))

#               group year val sum_rel
# 1                 a 1927  NA    -110
# 2                 a 1928  20     -90
# 3                 a 1929  50     -40
# 4                 a 1930  40       0
# 5                 a 1931  45      45
# 52                b 1934  NA       0
# 51                b 1935 -10     -10
# 6                 b 1936 -15     -25