2014-04-11 29 views
17

Bir dataframe olduğunu varsayalım öyle ki:Kümülatif toplamı R grubuna nasıl alınır?

df<-data.frame(id=1:8,group=c(1,0,0,1,1,0,1,0),rep=c(rep("d1",4),rep("d2",4)),value=rbinom(8,1,0.6)) 
df 
    id group rep value 
1 1  1 d1  0 
2 2  0 d1  0 
3 3  0 d1  0 
4 4  1 d1  1 
5 5  1 d2  1 
6 6  0 d2  0 
7 7  1 d2  1 
8 8  0 d2  1 

ne şekilde iyi group tarafından kümülatif toplamı almanın yolu ve rep var:

cumsum 
group d1 d1+d2 d1+d2+d3 
0  0  1  ... 
1  1  3  ... 
+2

'cumsum' bir işlevdir. '? Cumsum' yazın. Benzer işlevlere ('' '' '' '' '' '' '' '' '' '' '' ''' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ile '' '' '' '' '' '' '' '' '' '' '' '' '' 'yani' '(df $ değeri, df $ grubu, cumsum)' d tek yönlü – Frank

+0

Demoyu kullanarak cevap verebilir misiniz? +1 –

+0

Hepsini bir veri çerçevesinde elde etmek için: 'do.call (rbind, by (df $ değer, df $ grubu, cumsum))' – josliber

cevap

10
library(data.table) 

# convert to data.table in place 
setDT(df) 

# dcast and do individual sums 
dt.cast = dcast.data.table(df, group ~ rep, value.var = 'value', 
          fun.aggregate = sum) 
dt.cast 
# group d1 d2 
#1:  0 0 1 
#2:  1 1 2 

# cumsum 
dt.cast[, as.list(cumsum(unlist(.SD))), by = group] 
# group d1 d2 
#1:  0 0 1 
#2:  1 1 3 
13

birlikte çalıştığım öneriyoruz tidy veri formu. İşte dplyr bir yaklaşım, ama tekrarlanabilir örnek kılmak için rastgele tohum ayarı, ben veri kümesi yaratacağız data.table veya baz R.

İlk çevirmek için önemsiz olacaktır:

set.seed(1014) 
df <- data.frame(
    id = 1:8, 
    group = c(1, 0, 0, 1, 1, 0, 1, 0), 
    rep = c(rep("d1", 4), rep("d2", 4)), 
    value = rbinom(8, 1, 0.6) 
) 
df 

%> id group rep value 
%> 1 1  1 d1  1 
%> 2 2  0 d1  0 
%> 3 3  0 d1  0 
%> 4 4  1 d1  1 
%> 5 5  1 d2  1 
%> 6 6  0 d2  1 
%> 7 7  1 d2  1 
%> 8 8  0 d2  1 

Sonraki, dplyr kullanarak, ilk grup tarafından tek tek satırların yanında daraltmak edeceğiz ve sonra kümülatif toplamını hesaplamak:

library(dplyr) 

df <- df %>% 
    group_by(group, rep) %>% 
    summarise(value = sum(value)) %>% 
    mutate(csum = cumsum(value)) 
df 

%> Source: local data frame [4 x 4] 
%> Groups: group 
%> 
%> group rep value csum 
%> 1  0 d1  0 0 
%> 2  0 d2  2 2 
%> 3  1 d1  2 2 
%> 4  1 d2  2 4 

çoğu durumda, sen leav en iyileridir Bu formdaki verileri ing (o çalışmak için daha kolay olacaktır), ancak gerekirse yeniden şekillendirmek olabilir:

library(reshape2) 

dcast(df, group ~ rep, value.var = "csum") 

%> group d1 d2 
%> 1  0 0 2 
%> 2  1 2 4 
İlgili konular