用dplyr quos引用...中的各个变量

时间:2017-05-24 18:40:10

标签: r dplyr rlang

阅读programming with dplyr指南,我可以一次引用所有...个变量。但是我如何单独使用它们呢?

这是一个计算两个变量的函数。它使用quos()!!!成功:

library(dplyr) # version 0.6 or higher
library(tidyr)

# counts two variables
my_fun <- function(dat, ...){

  cols <- quos(...)

  dat <- dat %>%
    count(!!!cols)

  dat

}

my_fun(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

现在我想tidyr::spread第二个变量,在本例中是am列。当我添加到我的功能时:

result <- dat %>%
    tidyr::spread(!!!cols[[2]], "n", fill = 0)

我明白了:

  

错误:列规范无效

我应该如何仅引用cols <- quos(...)列表的第二个变量?

2 个答案:

答案 0 :(得分:3)

目前尚不清楚spread是否与quosure一起使用。一个选项是将spread_与字符串

一起使用
my_fun <- function(dat, ...){

  cols <- quos(...)

  dat %>%
    select(!!! cols) %>% 
    count(!!! cols) %>%
    spread_(quo_name(cols[[2]]), "n", fill = 0)

   }

my_fun(mtcars, cyl, am)
# A tibble: 3 x 3
#   cyl   `0`   `1`
#* <dbl> <dbl> <dbl>
#1     4     3     8
#2     6     4     3
#3     8    12     2

答案 1 :(得分:1)

改为使用命名参数。如果您依赖于对...列表的不同元素执行不同的操作,那么只有明确才有意义,这样才能更容易理解每​​个输入正在做什么,并使您更容易操作