2017-05-24 19 views
2

閱讀指南programming with dplyr,我能夠一次參考所有的...變量。但我怎樣才能單獨使用它們?參考...中的單個變量與dplyr quos

這是一個計算兩個變量的函數。它成功使用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) 

我得到:

Error: Invalid column specification

我應該如何參考只是cols <- quos(...)名單的第二個變量?

+0

您正在使用什麼版本tidyr的? – MrFlick

+0

tidyr 0.6.3目前,但如果它與問題相關,我可以切換 –

回答

1

改爲使用命名參數。如果你依賴對......列表中的不同元素做不同的事情,那麼只有明確地理解才能理解每個輸入的作用,並使其更容易操作。

+0

我的實際示例更復雜,用戶可以在'...'中指定1,2或3個變量,然後是其他命名參數。爲了未來的讀者,我想看看如何將'...'分解爲dplyr下的位置參考0.6 –

+0

對我來說,使用命名參數似乎仍然是特別的方法你已經設定了數字。在我看來,處理這樣一種情況要容易得多,在這種情況下,任何事情都不會傳遞給一個或多個參數,而不是試圖解析點列表並在事實之後採取相應措施。 – Dason

+0

我試過這兩種方式,我想我同意,對於我的具體情況,我最好使用命名參數而不是'...'。感謝您的建議!我會暫時將問題留給其他人,因爲其他人可能會來這裏尋找解析dplyr版本> = 0.6中'...'的方法。 –

2

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