2017-08-24 1 views
0

Je suis le R de H. Wickham pour Data Science et je n'ai pas réussi à faire un extrait de code de ce livre. Je me réfère à la section this et au graphique suivant du livre. plot.Livre "R pour Data Science" (Wickham). Impossible de reproduire l'exemple

J'ai littéralement copié et collé la partie du code du livre, mais cela ne fonctionne pas comme prévu.

library(tidyverse) 
library(forcats) 

by_age <- gss_cat %>% 
    filter(!is.na(age)) %>% 
    group_by(age, marital) %>% 
    count() %>% 
    mutate(prop = n/sum(n)) 

ggplot(by_age, aes(age, prop, color = marital)) + 
    geom_line(na.rm = TRUE) 

Et même si je l'utilise ungroup() %>% juste avant mutate() il trace quelque chose, mais pas ce qui est dans le livre (modèle légèrement différent).

J'apprécierais grandement que quelqu'un puisse expliquer ce paradoxe.

Le problème principal est que prop sont tous égaux à 1 dans mon cas. En conséquence, je reçois juste une ligne horizontale sur l'intrigue.

Merci!

tidyverse Version: 1.1.1 version R 3.4.1 (30/06/2017) Plate-forme: x86_64-w64-mingw32/x64 (64 bits) Fonctionnant sous Windows 7 x64 Service (build 7601) Pack 1

+0

Works pour moi. Quelles versions des paquets utilisez-vous? – thelatemail

+0

Eh bien, qu'est-ce que vous obtenez? Essayez d'exécuter 'tidyverse_update()' – vincentmajor

+0

> packageVersion ("tidyverse") '1.1.1' – AnnaZ

Répondre

3

Cela semble être un problème plutôt simple avec le code. Oui, il devrait probablement être fixé par Hadley et co mais ce n'est pas un gros problème.

Si vous commencez par l'impression by_age dans la console, vous devriez voir:

# A tibble: 351 x 4 
# Groups: age, marital [351] 

Ainsi, le Tibble est regroupé par les deux age et marital. Cela signifie que count() et sum(n) (dans les limites de mutate) renvoient la même valeur puisque sum est uniquement calculé sur le groupe avec une seule valeur, c'est-à-dire sum(n) == n ->prop === 1.

Vous étiez sur la bonne voie avec un ungroup() cependant, le calcul désiré est la proportion de chaque état civil pour chaque âge. Donc, ajoutez un group(age) entre le count et mutate et vous êtes en or.

by_age <- gss_cat %>% 
    filter(!is.na(age)) %>% 
    group_by(age, marital) %>% 
    count() %>% 
    group(age) %>% 
    mutate(prop = n/sum(n)) 

ggplot(by_age, aes(age, prop, color = marital)) + 
    geom_line(na.rm = TRUE) 

Résultats dans:

result