2013-08-23 48 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'你会得到一个错误,我不能为我的生活找出为什么这不适合我...直到你发布了它。由于我猜想用于分组变量的'...' –