J'ai un ensemble de données que je souhaite group_by () et générer un histogramme pour chaque groupe. Mon code actuel est le suivant:
df = data.frame(x1 = rep(c(1998,1999,2000),9),
x2 = rep(c(1,1,1,2,2,2,3,3,3),3),
x3 = rnorm(27,.5))
Cela génère cependant un histogramme unique de l'intégralité de x3 plutôt que plusieurs morceaux de x3 voici quelques exemples de données
df %>% group_by(x2) %>% with(hist(x3,breaks = 50))
4 Réponses :
Je pense qu'il est temps de passer à ggplot, par exemple:
library(tidyverse) df %>% ggplot(aes(x = x3)) + geom_histogram(bins = 50) + facet_wrap(~x2) # optional: use argument "ncols = 1"
Il me manque peut-être quelque chose, l'OP a inclus des exemples de données
facet_grid (rows = vars (x2)) est plus cohérent avec la sortie attendue de l'OP. Et dans le code de création de données de l'OP, j'ai ajouté un zéro à chaque vecteur de colonne.
Cependant, je ne vois rien dans l'historique des modifications de l'article. Ne le dis pas comme une faute avec ton message
Mon commentaire sur do est daté, je suppose. ? do nous indique la ?group_walk actuelle :
df %>% group_by(x2) %>% do(h = hist(.$x3))
Dans les versions de dplyr group_walk , vous pouvez donc utiliser do:
df %>% group_by(x2) %>% group_walk(~ hist(.x$x3))
En supposant que vous ne vouliez que les effets secondaires de hist (histogramme imprimé), pas les valeurs renvoyées, vous pouvez ajouter un %>% invisible () à la fin de la chaîne pour ne pas imprimer le tibble résultant. p>
D'où vient group_walk ? sos :: findFn ('group_walk') a trouvé 0 correspondance.
C'est une fonction de dplyr, vous devrez peut-être mettre à jour la version la plus récente du package.
@RuiBarradas Je suppose que c'était nouveau dans dplyr 0.8.0. Je vais ajouter une version do pour une compatibilité ascendante.
Merci! Cela fait exactement ce que je voulais. est-il possible de passer d'autres arguments dans l'appel group_walk () ? Par exemple, changer le titre principal pour être quelle que soit la variable de regroupement? Quelque chose comme `main = .x $ x2 '(cette syntaxe ne fonctionne pas avec" colonne inconnue ou non initialisée) -edit- l'a compris, besoin d'initialiser la colonne avec .y $ x2
Merci. En attendant, j'ai mis à jour le package dplyr .
Vous pouvez utiliser la commande split.data.frame pour diviser les données en fonction des catégories, après avoir exécuté une commande hist dans la liste des blocs de données
list_df <- split.data.frame(df, f= df$x2)
par(mfrow = c(round(length(list_df), 0), 1))
for( lnam in names(list_df)){
hist(list_df[[lnam]][, "x3"])
}
p>
split est une fonction S3, donc si vous utilisez simplement split (df, f = df $ x2) , il enverra split.data.frame pour vous.
J'aime beaucoup la réponse de @ Gregor avec group_walk , mais elle est toujours répertoriée comme expérimentale dans dplyr v0.8.0.1. Si vous voulez éviter de travailler avec des fonctions qui pourraient se casser plus tard, j'utiliserais la base split , puis purrr :: walk . J'utilise walk et plot pour éviter toutes les impressions de texte que donne hist .
library(dplyr) library(purrr) df %>% split(.$x2) %>% walk(~hist(.$x3) %>% plot())
Bonne réponse! Considérez %>% invisible comme un moyen plus direct / général d'éviter la sortie de texte.
Les fonctions de base R telles que
histne se soucient pas dugroup_byde dplyr.? dodevrait aiderhist ne prend qu'une colonne de données, il ignore votre regroupement. Utilisez plutôt ggplot ou faites
@infominer OP redirige vers
avec, qui prend toute la trame de données. Le problème est que les fonctions extérieures àdplyrignorent le regroupement --- ceci est tout aussi vrai pourggplotque pouravecouhist.@Gregor, toi aussi. Je l'ai remarqué après avoir tapé mon commentaire. avec ggplot, ils devront faire des facettes ou avoir la possibilité d'utiliser le remplissage pour colorer les barres.