计算相对累积和

问题描述:

我的样本数据是这样的:计算相对累积和

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功能,但无法弄清楚过度组适用于它,我会很高兴,如果你能帮助我。

+0

我不能1930了解重复计算的价值逻辑正和1930年负和扩展这样的区域。这个专栏应该是什么解释?你可以使用'ave'或'split'对cumsum进行申请,但是你想要做的更加不寻常。 – MrFlick 2014-12-07 05:50:29

+0

@MrFlick。抱歉,我手工创建的'解决方案'确实包含错误的值。请看看我的编辑,这是否更清楚? – nebuloso 2014-12-07 06:14:33

+0

是的,这有点清晰。 – MrFlick 2014-12-07 06:32:38

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

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