2017-10-08 8 views
0

J'essaie de créer un graphique à barres qui montre les salaires horaires moyens des travailleurs syndiqués et non syndiqués regroupés par célibataires ou mariés regroupés par diplômé ou non. Alors que j'ai réussi à construire un barplot passable avec deux groupes de facteurs, je ne peux pas comprendre comment le faire avec trois groupes de facteurs. Les exemples que j'ai vus qui ont trois facteurs ne tiennent compte que du nombre de fréquences, donc je ne suis pas sûr de savoir comment incorporer la moyenne d'une autre variable dans tous les facteurs de la parcelle. Ce que je cherche à créer quelque chose qui ressemble à ceci (créé en Stata): Average Hourly Wage by Union Status, Marital Status, and College Graduation Mon code ressemble à ceci:Barplots avec plusieurs groupes de facteurs et moyenne de variable entre ces facteurs

levelbar = tapply(wage, list(as.factor(union), as.factor(married), 
as.factor(collgrad)), mean) 
par(mfrow = c(1, 2)) 
barplot(levelbar, beside = TRUE) 
barplot(t(levelbar), beside = TRUE) 

Quand je lance cela, cependant, je reçois l'erreur:

Error in barplot.default(levelbar, beside = TRUE) : 
'height' must be a vector or a matrix 

Toute aide à ce sujet serait appréciée. Je suis sûr que ggplot pourrait être utile ici, mais je n'ai pas beaucoup d'expérience dans l'utilisation de ce paquet.

Répondre

0

Voici un exemple reproductible utilisant ggplot et le jeu de données intégré Titanic. Notez que nous calculons les moyennes d'abord et utilisons stat = identity pour nous assurer que nous obtenons ceux dans l'intrigue.

# Format the Titanic dataframe 
Titanic_df <- Titanic %>% as_tibble() 

# Make Class, Sex, Age, and Survived factors 
for (col in c("Class", "Sex", "Age", "Survived")) { 
    Titanic_df[[col]] <- factor(Titanic_df[[col]]) 
} 

# Get by group means 
means <- Titanic_df %>% 
    group_by(Class, Sex, Survived) %>% 
    summarise(
    mean_n = mean(n) 
) 

# Plot: facets are the Classes, bar colors are the two Sexes, and the groupings in each facet are Survived vs. Not Survived 
ggplot(data = means) + 
    geom_bar(aes(x = Survived, y = mean_n, fill = Sex), stat = "identity", position = "dodge") + 
    facet_wrap(~ Class) 

enter image description here

+0

Merci! Si je veux éliminer la troisième colonne qui apparaît, le niveau de facteur d'union a NAs, où est-ce que je mettrais cela? J'ai essayé 'signifie <- nlsw_df %>% na.omit()%>% group_by (union, marié, collgrad)%>% Résumer ( mean_wage = moyenne (salaire) )' J'ai essayé 'ggplot (données = na.omit (moyen)) + geom_bar (aes (x = collgrad, y = mean_wage, fill = union), stat = "identité", position = "esquive") + facet_wrap (~ marié) ' J'ai essayé ' pour (col en c ("union", "marié", "collgrad")) { nlsw_df [[col]] <- factor (nlsw_ df [[col]], exclude = NA) } ' –

+0

Il semble qu'il y ait toujours un niveau de facteur NA même si vous vous êtes débarrassé des valeurs NA. Enchaînement 'droplevels()' après vous 'na.omit()' (ou 'drop_na (union)' si vous voulez seulement jeter les lignes avec NAs dans la colonne union) devrait faire l'affaire. – amanda

+0

Salut Amanda, Merci pour la réponse. Je pense que vous avez raison de dire que c'est la bonne chose à faire, mais je ne peux pas le faire fonctionner pour une raison quelconque. Malgré l'enchaînement des droplevels() après le na.omit(), la troisième barre NA non utilisée apparaît toujours sur le graphique. Le code que j'ai couru est: 'signifie <- nlsw_df %>% na.omit (union)%>% droplevels (syndicat)%>% group_by (union, marié, collgrad)%>% Résumer ( mean_wage = moyenne (salaire) ) ggplot (données = moyen) + geom_bar (aes (x = collgrad, y = mean_wage, fill = union), stat = "identité", position = "esquive") + facet_wrap (~ marié) ' –