2013-08-23 1 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 

Есть ли разумный способ сделать это без петель? (Например, применять функции)

+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', вы получите сообщение об ошибке, и я не смог бы на всю жизнь разобраться, почему это не работает для меня ... пока вы отправили его. Из-за '...' для группировки переменных, я думаю –

 Смежные вопросы

  • Нет связанных вопросов^_^