2017-07-24 6 views
0

Der Versuch, bedingt basierend auf den vorherigen Gruppierungen zu summieren. Schwierigkeiten dabei zu haben.bedingte Zusammenfassung/muate in dplyr

Ich versuche, die amt Spalte basierend auf denen im Typ r1, nach der Gruppierung von f zusammenzufassen.

Reproduzierbare Code:

s <- sample(c('one', 'two'), 96, replace = TRUE) 
f <- sample(c('a','s','d','f'), 96, replace = TRUE) 
r1_amt <- runif(96, 1, 100) 
r2_amt <- runif(96, 1, 100) 
r3_amt <- runif(96, 1, 100) 
x <- data_frame(s, f, r1_amt, r2_amt, r3_amt) 


smy <- x %>% 
    group_by(f) %>% 
    summarise(n = n(), # population in each f group 
      num_r1 = sum(r1_amt >= 50)) # amount of r1 in each f group 

Ich habe versucht .[r1_amt >= 50]$amt, cumsum(r1_amt >= 50), sum(ifelse(r1_amt >= 50, r1_amt, 0)) aber nicht in der Lage mit den gruppierten Zahlen zu kommen.

Also 1 gegebene Zeile könnte eine 60 für r1, 40 für r2 und 55 für r3 und es sollte in der summierten Betrag Spalte für nur r1 und r3 enthalten sein, wenn das Sinn macht.

+0

Was Ausgang Ihre erwartete ist? – Psidom

+0

habe ich das reproduzierbare Beispiel angepasst, da ich es nicht ganz richtig gemacht habe. Ich möchte eine gegebene Beobachtung als r1 klassifizieren, wenn sie im r1_amt mehr als 50 hat. Und dann sollte die sum_r1_amt Spalte die Summe von r1_amt sein, nur wenn die Beobachtung über 50 ist. –

+1

@MattW. Wenn Sie Ihre Frage ändern möchten, fragen Sie eine andere als Follow-up. Es ist nicht professionell, nach 16 Stunden zurückzukommen und deine Frage zu bearbeiten. Es ist nicht so schwer, meine Antwort zu ändern, um Ihre neue Anfrage zu beantworten, aber ich überlasse das Ihnen oder vielleicht anderen Antworten. – Masoud

Antwort

1

Dies kann auch in einem etwas sauberer Weise möglich sein, aber dies sollte funktionieren:

x.v2 <- x # temp variable 
x.v2[which(x[,4] != 'r1'),3] <- 0 # replace values of tpe != 'r1' with 0's 

smy <- x.v2 %>% 
      group_by(f) %>% 
      summarise(n = n(), # population in each f group 
      num_r1 = sum(amt)) # sum of values for type == 'r1' in each group f 

rm(x.v2) # remove temp variable 

smy # output for seed = 123 (use set.seed(123) for building data) 


# f n num_r1 
# 1 a 20 114.1879 
# 2 d 28 611.9858 
# 3 f 19 351.5366 
# 4 s 29 357.8402 
1

Es klingt wie das, was man sowohl f gerade Gruppe tun möchte, ist, und geben Sie die pro-f berechnen/Statistiken eingeben

x %>% group_by(f, type) %>% summarise(num_type=n(), sum_type=sum(amt)) 
Source: local data frame [16 x 4] 
Groups: f [?] 

     f type num_type sum_type 
    <chr> <chr> <int>  <dbl> 
1  a r1  12 616.6610 
2  a r2  6 417.5589 
3  a r3  9 375.2246 
4  a r4  7 346.5796 
5  d r1  8 471.1253 
... 

Sie können tidyr verwenden für das sum_type Feld breite Form zurück zu gehen, aber ich würde so für die Anzeige nur tun:

> res %>% spread(type, sum_amt) 
Source: local data frame [12 x 6] 
Groups: f [4] 

     f num_type  r1  r2  r3  r4 
* <chr> <int> <dbl> <dbl> <dbl> <dbl> 
1  a  6  NA 417.5589  NA  NA 
2  a  7  NA  NA  NA 346.5796 
3  a  9  NA  NA 375.2246  NA 
... 
+0

Sie haben definitiv Recht. Mir ist klar, dass ich das reproduzierbare Beispiel nicht wirklich erstellt habe, weil Gruppierung am sinnvollsten ist. Lassen Sie mich bearbeiten, um zu klären –