首页 文章

如何在函数中使用dplyr :: group_by

提问于
浏览
3

我想创建一个函数,它将生成一个基于一个或多个分组变量计数的表 . 我发现这篇文章Using dplyr group_by in a function,如果我将函数传递给一个变量名,它就有效

library(dplyr)
l <- c("a", "b", "c", "e", "f", "g")
animal <- c("dog", "cat", "dog", "dog", "cat", "fish")
sex <- c("m", "f", "f", "m", "f", "unknown")
n <- rep(1, length(animal))
theTibble <- tibble(l, animal, sex, n)


countString <- function(things) {
  theTibble %>% group_by(!! enquo(things)) %>% count()
}

countString(animal)
countString(sex)

这很好用,但我不知道如何传递函数两个变量 . 这种作品:

countString(paste(animal, sex))

它给了我正确的计数,但返回的表将动物和性变量折叠成一个变量 .

# A tibble: 4 x 2
# Groups:   paste(animal, sex) [4]
  `paste(animal, sex)`    nn
  <chr>                <int>
1 cat f                    2
2 dog f                    1
3 dog m                    2
4 fish unknown             1

传递函数的语法是用逗号分隔的两个单词的语法是什么?我想得到这个结果:

# A tibble: 4 x 3
# Groups:   animal, sex [4]
  animal sex        nn
  <chr>  <chr>   <int>
1 cat    f           2
2 dog    f           1
3 dog    m           2
4 fish   unknown     1

2 回答

  • 5

    您可以使用 group_by_at 和列索引,例如:

    countString <- function(things) {
      index <- which(colnames(theTibble) %in% things)
      theTibble %>% 
           group_by_at(index) %>% 
           count()
    }
    
    countString(c("animal", "sex"))
    
    ## A tibble: 4 x 3
    ## Groups:   animal, sex [4]
    #  animal sex        nn
    #  <chr>  <chr>   <int>
    #1 cat    f           2
    #2 dog    f           1
    #3 dog    m           2
    #4 fish   unknown     1
    
  • 2

    对于多个参数,我们将'things'替换为 ... ,对于多个参数,我们将 enquos 替换为 enquos . 删除 group_bycount

    countString <- function(...) {
      grps <- enquos(...)
      theTibble %>%
           count(!!! grps) 
    }
    
    
    countString(sex)
    # A tibble: 3 x 2
    #  sex        nn
    #  <chr>   <int>
    #1 f           3
    #2 m           2
    #3 unknown     1
    
    countString(animal)
    # A tibble: 3 x 2
    #  animal    nn
    #  <chr>  <int>
    #1 cat        2
    #2 dog        3
    #3 fish       1
    
    countString(animal, sex)
    # A tibble: 4 x 3
    #  animal sex        nn
    #  <chr>  <chr>   <int>
    #1 cat    f           2
    #2 dog    f           1
    #3 dog    m           2
    #4 fish   unknown     1
    

相关问题