0
votes

Comment grouper par plusieurs valeurs dans une fonction avec dplyr

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 .

r

2 commentaires

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.)


3 Réponses :


2
votes

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


0 commentaires

0
votes

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


0 commentaires

0
votes

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


0 commentaires