2013-08-23 49 views
1

可能這個問題已經在SO中解決和回答,但無法找到答案。我正在計算一個非常大的數據框上的條件的累計和。看看下面的例子有條件的累積和在R中應用函數

Data=data.frame("Catg"=c("A","A","A","A","A","B","B","B","C","C","C","D","D","D","D","D","D","D","D","E","E","F"),"Val"=c(67,42,12,32,28,1,11,9,38,61,75,99,22,44,89,99,51,34,82,99,74,42)) 
Res=NULL 
UniqCatg=unique(Data$Catg) 
for(i in 1:length(UniqCatg)) 
    Res=c(Res, cumsum(Data[Data$Catg==UniqCatg[i],"Val"])) 
Data$Res=Res 
Data 

有沒有一個聰明的方法來做到這一點,而不是for循環? (如適用功能)

+0

您好,我注意到你有*** ***從來沒有接受一個答案。您可能需要閱讀網站的[** about **](http://stackoverflow.com/about)和[** FAQ **](http://stackoverflow.com/faq)部分以幫助您充分利用SO。如果答案確實解決了您的問題,您可能需要考慮*將其標記爲接受並/或將其標記爲已接受,以顯示問題已回答,方法是勾選合適答案旁邊的小綠色複選標記。你是**沒有義務這樣做,但它有助於保持網站清潔未解決的問題,並獎勵那些花時間解決問題的人。 –

回答

1

或用plyr::ddply ...

require(plyr) 
ddply(Data , "Catg" , transform , Res = cumsum(Val)) 
# Catg Val Res 
#1  A 67 67 
#2  A 42 109 
#3  A 12 121 
#4  A 32 153 
#5  A 28 181 
#6  B 1 1 
#7  B 11 12 
#8  B 9 21 
#9  C 38 38 
#10 C 61 99 
#11 C 75 174 
#12 D 99 99 
#13 D 22 121 
#14 D 44 165 
#15 D 89 254 
#16 D 99 353 
#17 D 51 404 
#18 D 34 438 
#19 D 82 520 
#20 E 99 99 
#21 E 74 173 
#22 F 42 42 
3

你可以使用ave

Data$Res <- ave(Data$Val, Data$Catg, FUN=cumsum) 
# Catg Val Res 
#1  A 67 67 
#2  A 42 109 
#3  A 12 121 
#4  A 32 153 
#5  A 28 181 
#6  B 1 1 
#7  B 11 12 
#8  B 9 21 
#9  C 38 38 
#10 C 61 99 
#11 C 75 174 
#12 D 99 99 
#13 D 22 121 
#14 D 44 165 
#15 D 89 254 
#16 D 99 353 
#17 D 51 404 
#18 D 34 438 
#19 D 82 520 
#20 E 99 99 
#21 E 74 173 
#22 F 42 42 
+0

謝謝老兄!它幫助我 – user813966

+2

+1 - 我想發佈這個,但如果你不輸入'FUN'你會得到一個錯誤,我不能爲我的生活找出爲什麼這不適合我...直到你發佈了它。由於我猜想用於分組變量的'...' –