2017-05-25 2 views
0

Si j'ai une trame de données simple avec 2 facteurs (a et b) avec 2 niveaux (1 et 2) et 1 variable (x), comment puis-je obtenir les valeurs médianes de x : médiane x sur chaque niveau de facteur a, chaque niveau de facteur b, et chaque combinaison de a * b?R - résumé dplyr sur des combinaisons de facteurs

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))) 

J'ai essayé différentes (beaucoup) de versions:

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

Les résultats devraient ressembler à ceci pour la médiane x de chaque niveau de facteur a:

une médiane
1 0,58811
2 0,53167

Et comme celui-ci pour la médiane x de chaque niveau de facteur b:

b médiane
1 0,60622
2 0,46096

Et comme celui-ci pour la médiane x pour chaque combinaison de a et b:

ab médiane
1 1 0,66745
1 2 0,34656
2 1 0,50903
2 2 0,55990

Merci à l'avance pour toute aide.

+0

prendre la 'df $' de la 'summarise' –

+0

Vous n'avez pas besoin de devis et vous pouvez utiliser' 'group_by'-à-dire df%>% group_by (a, b)%>% Résumer (med_rate = médiane (x)) ' – akrun

+0

Merci. Mais cela me donne une valeur médiane; la médiane x au cours de l'observation de 16. Il ne me donne pas les valeurs médianes de chaque niveau (1 et 2) de chaque facteur (a & b) et de chaque niveau de chaque combinaison a * b. –

Répondre

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

Merci; mais je reçois un message d'erreur en réponse à chaque commande "df [, median (x), by = z]:" argument non utilisé (par = z) " –

+0

avez-vous une colonne nommée z? – simone

+0

donc je n'ai pas eu à répéter le message d'erreur 3 fois: une fois pour chaque commande (par = a; par = b; par =. (a, b). –

0

Ce qui suit est pas très élégant, mais crée un data.frame unique qui répond à vos résultats escomptés.

Nous créons trois données data.frames (pour a, b et a * b) et de les combiner en un seul.

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)) 
)