2014-12-07 178 views
1

我的樣本數據是這樣的:計算相對累積和

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

回答

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