2017-01-27 2 views
0

Ähnlich wie this post, ich möchte einen Datenrahmen durch eine ID (sagen wir Month) gruppieren und den Mittelwert und die Standardabweichung pro Gruppe berechnen. Der Unterschied ist, dass ich möchte, dass die beiden Spalten Rate 1 und Rate 2 mit dem Mittelwert und dem sd von beiden kombiniert werden.Aggregieren/gruppieren in eine Spalte nach ID, um den Mittelwert & sd über alle Spalten zu berechnen

Name  Month Rate1  Rate2 
Aira  1  12  23 
Aira  2  18  73 
Aira  3  19  45 
Ben  1  53  19 
Ben  2  22  87 

Der Datenrahmen oben sollte Month und für jeden Monat berechnet die mean Rate über beiden Spalten gruppiert werden. Zum Beispiel sollte der Mittelwert von Monat 1 (12 + 23 + 53 + 19)/4 = 26,75 sein. Ich nehme an, der Ansatz für sd ist ähnlich.

Month Mean_rate 
1  26.75 
2  50 
3  32 
+0

Wie sind diese Werte in 'mean_rate' Spalte gekommen? Kannst du deine Ausgabe erklären? –

+0

Es sollte der Mittelwert jedes Monats sein, der die Werte von beiden Spalten verwendet. Ich habe meine Frage aktualisiert, um ein Beispiel hinzuzufügen. Ich hoffe, das hilft – CGFoX

+0

Also nur 'Bibliothek (dplyr); df%>% group_by (Monat)%>% zusammenfassen (neu = mittel (Rate1 + Rate2)/2) '? – Sotos

Antwort

1
## Input data frame 
df <- data.frame(Name=sample(letters,5),Month=c(1,2,3,1,2),Rate1=c(12,18,19,53,22),Rate2=c(23,73,45,19,87)) 

## Split data set on month 
df_splitted <- split(df[,3:4],df$Month) 

## Desired Output 
df_out <- data.frame(Month=as.numeric(names(df_splitted)), 
        Mean=sapply(lapply(df_splitted,unlist),mean), 
        sd=sapply(lapply(df_splitted,unlist),sd), 
        stringsAsFactors=FALSE) 
## Plot 
plot(df_out$Month, df_out$Mean, 
ylim=range(c(df_out$Mean-df_out$sd, df_out$Mean+df_out$sd)), 
pch=19, xlab="Measurements", ylab="Mean +/- SD", 
main="Scatter plot with std.dev error bars") 
arrows(df_out$Month, df_out$Mean-df_out$sd, df_out$Month, 
     df_out$Mean+df_out$sd, length=0.05, angle=90, code=3) 

## Explanation 
# Split the data frame into a list of data frame while keeping 
# rows with same month value together 
temp1 <- split(df[,3:4],df$Month) 

# Convert the list of data frames into list of vectors 
temp2 <- lapply(temp1,unlist) 

# For every vector in list it calculates the mean 
sapply(temp2,mean) 

Das resultierende Objekt ist ein Vektor, während Namen des Vektors den Monat darstellen, für die sie berechnet wird.

+0

Das funktioniert, aber könnten Sie erklären, was es ist macht und was ist der resultierende Datentyp? Ich möchte damit ein Streudiagramm mit Fehlerbalken zeichnen. – CGFoX

+0

Erklärung Hinzugefügt – anonR

+0

Entschuldigung, ich bin neu in R und habe Probleme mit den resultierenden Daten zu arbeiten. Wenn ich die Mittel darstellen möchte, musste ich die Monate für die X-Achse (als Zahlen) extrahieren und dann nur die Mittelwerte für die Y-Achse erhalten (mit 'names()' und 'unname()'). Gibt es einen einfachen Weg, dies zu tun? Oder ist es möglich, das Ergebnis in einem Datenrahmen wie dem in meiner Frage zu speichern? – CGFoX

Verwandte Themen