2017-05-25 3 views
0

Wenn ich einen einfachen Datenrahmen mit 2 Faktoren (a und b) mit 2 Ebenen (1 und 2) und 1 Variable (x) habe, wie bekomme ich die Medianwerte von x : Median x über jeder Ebene von Faktor a, jeder Ebene von Faktor b und jeder Kombination von a * b?R - dplyr Zusammenfassung über Kombinationen von Faktoren

library(dplyr)  
df <- data.frame(a = as.factor(c(1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2)), 
    b = as.factor(c(1,1,1,1,2,2,2,2,1,1,1,1,2,2,2,2)), 
    x = c(runif(16))) 

Ich habe verschiedene (viele) Versionen versucht:

df %>% 
    group_by_(c("a", "b")) %>% 
    summarize(med_rate = median(df$x)) 

Die Ergebnisse, wie dies für den Median aussehen sollte eine x jeder Ebene des Faktors:

ein Median
1 0,58811
2 0,53167

Und wie dies für den Median x jeder Ebene der Faktor b:

b Median
1 0,60622
2 0,46096

Und wie dies für den Median x für jede Kombinationen von a und b:

ab medianen
1 1 0,66745
2 0,34656
2 1 0,50903
2 2 0,55990

Vielen Dank im Voraus für jede Hilfe.

+0

nehmen Sie die 'df $' aus der 'summarise' –

+0

Sie Anführungszeichen nicht benötigen und Sie können' group_by' dh 'df%>% group_by (a, b) verwenden%>% summarize (med_rate = Median (x)) ' – akrun

+0

Danke. Aber das gibt mir einen Medianwert; der Median x über die 16 Beobachtung. Es gibt mir nicht die Medianwerte jedes Niveaus (1 und 2) jedes Faktors (a & b) und jedes Niveaus jeder a * b Kombination. –

Antwort

0
set.seed(123) ##make your example reproducible 
require(data.table) 
df <- data.table(a = as.factor(c(1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2)), 
      b = as.factor(c(1,1,1,1,2,2,2,2,1,1,1,1,2,2,2,2)), 
      x = c(runif(16))) 

df[, median(x), by = a] 
df[, median(x), by = b] 
df[, median(x), by = .(a,b)] 
+0

Danke; aber ich bekomme eine Fehlermeldung als Antwort auf jeden "df [, Median (x), durch = z] Befehl:" unbenutztes Argument (durch = z) " –

+0

haben Sie eine Spalte namens z? – simone

+0

Nein. Das war Kurzschrift, also musste ich die Fehlermeldung nicht dreimal wiederholen: einmal für jeden Befehl (by = a; by = b; by =. (a, b). –

0

Das folgende ist nicht sehr elegant, sondern erstellt ein einzelnes data.frame, dass Ihr erwartetes Ergebnis erfüllt.

Wir erstellen drei Daten data.frames (für a, b und a * b) und kombinieren sie zu einem.

bind_rows(
    df %>% 
    group_by(a) %>% 
    rename(factor_g = a) %>% 
    summarize(med_rate = median(x)), 
    df %>% 
    group_by(b) %>% 
    rename(factor = b) %>% 
    summarize(med_rate = median(x)), 
    df %>% 
    # We create a column for grouping a*b 
    mutate(factor = paste(a, b)) %>% 
    group_by(factor) %>% 
    summarize(med_rate = median(x)) 
) 
Verwandte Themen