Je voudrais faire des tableaux pour la publication qui donnent le nombre d'observations, groupées par deux variables. Le code pour cela fonctionne bien. Cependant, j'ai rencontré des problèmes en essayant de transformer cela en fonction.Écrire sa propre fonction en utilisant dplyr et group_by - comment continuer avec les noms de colonne changés
J'utilise dplyr_0.7.2
Exemple d'utilisation: mtcars
code pour table à l'extérieur de la fonction: cela fonctionne
library(tidyverse)
tab1 <- mtcars %>% count(cyl) %>% rename(Total = n)
tab2 <- mtcars %>%
group_by(cyl, gear) %>% count %>%
spread(gear, n)
tab <- full_join(tab1, tab2, by = "cyl")
tab
# This is the output (which is what I want)
A tibble: 3 x 5
cyl Total `3` `4` `5`
<dbl> <int> <int> <int> <int>
1 4 11 1 8 2
2 6 7 2 4 1
3 8 14 12 NA 2
Essayer de mettre cela en fonction
Fonction pour tab1: cela fonctionne
count_by_two_groups_A <- function(df, var1){
var1 <- enquo(var1)
tab1 <- df %>% count(!!var1) %>% rename(Total = n)
tab1
}
count_by_two_groups_A(mtcars, cyl)
A tibble: 3 x 2
cyl Total
<dbl> <int>
1 4 11
2 6 7
3 8 14
Fonction pour la première partie de tab2: il fonctionne jusqu'à ce point, mais ...
count_by_two_groups_B <- function(df, var1, var2){
var1 <- enquo(var1)
var2 <- enquo(var2)
tab2 <- df %>% group_by((!!var1), (!!var2)) %>% count
tab2
}
count_by_two_groups_B(mtcars, cyl, gear)
A tibble: 8 x 3
Groups: (cyl), (gear) [8]
`(cyl)` `(gear)` n
<dbl> <dbl> <int>
1 4 3 1
2 4 4 8
3 4 5 2
4 6 3 2
5 6 4 4
6 6 5 1
7 8 3 12
8 8 5 2
Les noms de colonnes ont changé (CYL) et (vitesse). Je n'arrive pas à comprendre comment continuer avec spread() et full_join() (ou n'importe quoi d'autre en utilisant les nouveaux noms de colonnes) maintenant que les noms des colonnes ont changé. C'est à dire. Je n'arrive pas à comprendre comment spécifier les nouveaux noms de colonnes de manière typhique, pour pouvoir continuer. J'ai essayé différentes choses, sans succès.
Je pense qu'il est utile de conserver un style uniforme dans un script. Aussi, si vous essayez de faire fonctionner Tidyeval, il est préférable de commencer avec de petites fonctions. Pour ces raisons, il est logique de répondre à la question initiale. – lionel
Une partie de mon problème était le manque de clarté de la question initiale. –