2016-07-26 18 views
2

Ich versuche, eine aggregierte Spalte zu einem Datenrahmen mit dplyr hinzufügen. Hier ist ein Beispiel dessen, was ich im Sinn haben:Hinzufügen einer aggregierten Spalte zu einem Datenrahmen mit dplyr

gender <- c("male", "female", "male") 
age <- c(25, 30, 56) 
weight <- c(160, 110, 220) 
mydata <- data.frame(gender, age, weight) 

I Gruppe der Datenrahmen mydata nach Geschlecht vor eine aggregierte Berechnung macht das durchschnittliche Gewicht von Geschlecht zu finden:

library(dplyr) 
mydata <- group_by(mydata, gender) 
mydata2 <- summarise(mydata, wt=mean(weight)) 

Gibt es Wie kann man die Spalte mit dem durchschnittlichen Gewicht im selben Schritt wie oben in den ursprünglichen Datenrahmen einfügen? In SQL, würde ich dies mit dem folgenden Code-Zeile erreichen:

SELECT gender, age, weight, avg(weight) as avg_wt FROM mydata GROUP BY gender 

Ich weiß, das eine sehr einfache Frage, aber ich bin neu in R und ich kann nicht die Antwort scheinen überall zu finden.

+0

Ersetzen zusammenfassen mit mutieren. –

Antwort

1

Falls es von Interesse ist, kann diese in Basis R erreicht werden unter Verwendung der ave Funktion:

mydata$avg_wt <- ave(mydata$weight, mydata$gender, FUN=mean) 

Das erste Argument ist die Variable auf die die Funktion angewendet wird, die zweite die Gruppierungsvariable, während die dritte die Funktion ist, die von der Gruppe angewendet wird.

mydata 
    gender age weight avg_wt 
1 male 25 160 190 
2 female 30 110 110 
3 male 56 220 190 

Beachten Sie, dass der Standardwert des FUN Argument „bedeuten“, so dass es möglich ist, die oben genannten Code zu

mydata$avg_wt <- ave(mydata$weight, mydata$gender) 

ich dieses Argument in der oben als Hinweis Antwort hinzugefügt zu verkürzen, dass Trotz seines Namens ist ave in der Lage, andere Statistiken (einschließlich benutzergeschriebener Funktionen) zu berechnen.

+0

@DavidArenburg Danke. Du hast recht. Ich füge es gern in die Antwort ein, um daran zu erinnern, dass Sie es trotz seines Namens dazu verwenden können, andere Funktionen zu berechnen. Ich werde das in meiner Antwort notieren. – lmo

4

Verwenden mutate anstelle von summarise:

mydata %>% group_by(gender) %>% mutate(wt = mean(weight)) 


#Source: local data frame [3 x 4] 
#Groups: gender [2] 
# 
# gender age weight wt 
# (fctr) (dbl) (dbl) (dbl) 
#1 male 25 160 190 
#2 female 30 110 110 
#3 male 56 220 190 
Verwandte Themen