如何使用dplyr在函数中按多个值分组

如何使用dplyr在函数中按多个值分组,r,R,我想知道如何修改下面的代码 xxx<-function(df,groupbys){ groupbys<-enquo(groupbys) df%>%group_by_(groupbys)%>%summarise(count=n()) } zzz<-xxx(iris,Species) xxx%摘要(计数=n() } zzz当使用enquo(单参数)或enquos(多参数)时,您应该使用和运算符 xxx% 计数()%>% 解组() } mtcars%>

我想知道如何修改下面的代码

xxx<-function(df,groupbys){
  groupbys<-enquo(groupbys)
    df%>%group_by_(groupbys)%>%summarise(count=n())
  }

zzz<-xxx(iris,Species)
xxx%摘要(计数=n()
}

zzz当使用
enquo
(单参数)或
enquos
(多参数)时,您应该使用
运算符

xxx%
计数()%>%
解组()
}
mtcars%>%xxx(共青团,上午)
##tibble:6 x 3
#共青团
#     
# 1     4     0     3
# 2     4     1     8
# 3     6     0     4
# 4     6     1     3
# 5     8     0    12
# 6     8     1     2
或者,如果您想在函数formals中为一个或多个列名保留一个参数,我认为您需要在调用中使用
vars()
。(也许在小插曲中还有其他建议。)

xxx%
分组依据(!!!组)%>%
计数()%>%
解组()
}
xxx(mtcars、vars(气缸、am))

使用
enquo
(单参数)或
enquos
(多参数)时,应使用
运算符

xxx%
计数()%>%
解组()
}
mtcars%>%xxx(共青团,上午)
##tibble:6 x 3
#共青团
#     
# 1     4     0     3
# 2     4     1     8
# 3     6     0     4
# 4     6     1     3
# 5     8     0    12
# 6     8     1     2
或者,如果您想在函数formals中为一个或多个列名保留一个参数,我认为您需要在调用中使用
vars()
。(也许在小插曲中还有其他建议。)

xxx%
分组依据(!!!组)%>%
计数()%>%
解组()
}
xxx(mtcars、vars(气缸、am))

在这一点上,您只需在
groupby
函数中使用
.dots
参数即可。只需确保
groupby
是一个字符。即

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
xxx%groupby(.dots=groupby)%>%summary(count=n())
}
xxx(鸢尾属,“物种”)
#一个tibble:3x2
物种计数
1刚毛50
2彩色50
3弗吉尼亚州50
xxx(鸢尾,c(“种类”,“花瓣长度”))
#A tibble:48 x 3
#类群:种[3]
种花瓣。长度计数
1刚毛11
2刚毛1.1 1
3刚毛1.2 2
4刚毛1.3 7
5刚毛1.4 13
6刚毛1.5 13
7刚毛1.6 7
8.1.7 4
9刚毛1.9 2
10彩色3 1

在这一点上,您只需在
groupby
函数中使用
.dots
参数即可。只需确保
groupby
是一个字符。即

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
xxx%groupby(.dots=groupby)%>%summary(count=n())
}
xxx(鸢尾属,“物种”)
#一个tibble:3x2
物种计数
1刚毛50
2彩色50
3弗吉尼亚州50
xxx(鸢尾,c(“种类”,“花瓣长度”))
#A tibble:48 x 3
#类群:种[3]
种花瓣。长度计数
1刚毛11
2刚毛1.1 1
3刚毛1.2 2
4刚毛1.3 7
5刚毛1.4 13
6刚毛1.5 13
7刚毛1.6 7
8.1.7 4
9刚毛1.9 2
10彩色3 1

这里有两种解决问题的方法。如果要将列名作为不带引号的变量传递,可以使用
..
并在
count
中使用它,而不是在
groupby
+
summary
中使用它

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

这里有两种解决这个问题的方法。如果要将列名作为不带引号的变量传递,可以使用
..
并在
count
中使用它,而不是在
groupby
+
summary
中使用它

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

你应该看看
vignette(“编程”)
,它在那里有介绍。xiahfyj,如果其中一个答案解决了你的问题,请;这样做不仅给回答者提供了一些观点,也为有类似问题的读者提供了一些结尾。虽然你只能接受一个答案,但你可以选择增加你认为有帮助的选票。(如果仍然存在问题,您可能需要编辑您的问题并提供更多详细信息。)您应该查看
vignette(“编程”)
,这里有介绍。xiahfyj,如果其中一个答案解决了您的问题,请;这样做不仅给回答者提供了一些观点,也为有类似问题的读者提供了一些结尾。虽然你只能接受一个答案,但你可以选择增加你认为有帮助的选票。(如果仍然存在问题,您可能需要编辑问题并提供更多详细信息。)