Je me demande comment modifier le code ci-dessous
xxx<-function(df,groupbys){
groupbys<-enquo(groupbys)
df%>%group_by_(groupbys)%>%summarise(count=n())
}
zzz<-xxx(iris,Species)
pour avoir la possibilité d'alimenter une colonne ou plusieurs colonnes par lesquelles regrouper? Par exemple, goup_by_ à la fois Species et Petal.Length avec l'ensemble de données iris .
3 Réponses :
Lorsque vous utilisez enquo (argument unique) ou enquos (multiple), vous devez utiliser !! et !!! opérateurs, respectivement.
xxx <- function(df, groups) {
df %>%
group_by(!!!groups) %>%
tally() %>%
ungroup()
}
xxx(mtcars, vars(cyl, am))
ou si vous souhaitez conserver un seul argument dans les formals de fonction pour un ou plusieurs noms de colonnes, je pense que vous devrez utiliser vars () dans l'appel. (Peut-être y a-t-il une autre façon suggérée dans la Programmation avec dplyr vignette.)
xxx <- function(df, ...) {
grps <- enquos(...)
df %>%
group_by(!!!grps) %>%
tally() %>%
ungroup()
}
mtcars %>% xxx(cyl, am)
# # A tibble: 6 x 3
# cyl am n
# <dbl> <dbl> <int>
# 1 4 0 3
# 2 4 1 8
# 3 6 0 4
# 4 6 1 3
# 5 8 0 12
# 6 8 1 2
Il s'agit d'un point permettant de simplement utiliser l'argument code> code> dans la fonction groupy code>. Assurez-vous simplement que le groupe code> est un caractère. IE xxx<-function(df,groupbys){
df%>%group_by(.dots = groupbys)%>%summarise(count=n())
}
xxx(iris,"Species")
# A tibble: 3 x 2
Species count
<fct> <int>
1 setosa 50
2 versicolor 50
3 virginica 50
xxx(iris,c("Species","Petal.Length"))
# A tibble: 48 x 3
# Groups: Species [3]
Species Petal.Length count
<fct> <dbl> <int>
1 setosa 1 1
2 setosa 1.1 1
3 setosa 1.2 2
4 setosa 1.3 7
5 setosa 1.4 13
6 setosa 1.5 13
7 setosa 1.6 7
8 setosa 1.7 4
9 setosa 1.9 2
10 versicolor 3 1
Voici deux approches du problème. Si vous souhaitez transmettre le nom de la colonne en tant que variables non entre guillemets, vous pouvez utiliser ... et l'utiliser dans count au lieu de group_by + résumer .
xxx<-function(df,groupbys){
df %>% group_by_at(groupbys) %>% summarise(n = n())
}
xxx(mtcars, c("cyl", "am"))
Deuxième approche si vous voulez passer le nom de la colonne en tant que variable entre guillemets (chaînes), vous pouvez utiliser group_by_at qui accepte les entrées de chaîne.
xxx<-function(df,...){
df %>% count(...)
}
xxx(mtcars, cyl)
# A tibble: 3 x 2
# cyl n
# <dbl> <int>
#1 4 11
#2 6 7
#3 8 14
xxx(mtcars, cyl, am)
# A tibble: 6 x 3
# cyl am n
# <dbl> <dbl> <int>
#1 4 0 3
#2 4 1 8
#3 6 0 4
#4 6 1 3
#5 8 0 12
#6 8 1 2
Vous devriez jeter un oeil à
vignette ("programmation"), c'est couvert ici.xiahfyj, si l'une des réponses répond à votre question, veuillez l'accepter ; cela offre non seulement un petit avantage au répondant avec quelques points, mais fournit également une certaine clôture pour les lecteurs ayant des questions similaires. Bien que vous ne puissiez accepter qu'une seule réponse, vous avez la possibilité d'en voter autant que vous le jugez utile. (S'il y a toujours des problèmes, vous devrez probablement modifier votre question avec plus de détails.)