2017-05-24 13 views
2

programming with dplyrへのガイドを読んで、すべての変数を一度に参照することができます。...しかし、私はそれらを個別にどのように使用できますか?dplyr quosでの個々の変数の参照

ここでは、2つの変数をカウントする関数を示します。それは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 

今、私は2番目の変数、この場合はam列をtidyr::spreadたい。私は私の機能に追加する場合:

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

私が取得:

Error: Invalid column specification

はどのようcols <- quos(...)リストのちょうど第二の変数を参照する必要がありますか?

+0

spread_を使用することですか? – MrFlick

+0

tidyr 0.6.3現在のところ、私は切り替えることができる問題に関連している場合 –

答えて

1

代わりに名前付きパラメータを使用します。 ...リストのさまざまな要素に対してさまざまなことをすることに頼っているのであれば、それは明示的であるため、各入力が何をしているのかを理解しやすく、操作しやすくなります。

+0

私の実際の例はより複雑で、ユーザーは1,2,3変数を '...'で指定してから、名前付きパラメータ。将来の読者のために、私はdplyrの下で位置によって参照するために '...'がどのように分解されるのかを見たいと思っています。0.6 –

+0

私にはまだ名前付きのパラメータを使うのが、数字を念頭に置きました。私の考えでは、ドットリストを解析し、それに応じて行動しようとするよりも、何もパラメータの1つ以上に渡されない状況に対処する方がずっと簡単です。 – Dason

+0

私は両方の方法で試してみましたが、私の特定のケースでは、 '...'の代わりに名前付きのパラメータを使う方が良いと私は同意したと思います。提案していただきありがとうございます! dplyrバージョン> = 0.6で '...'を解析する方法を探している人がいるかもしれないので、ここで質問を開いておきます。 –

2

spreadquosureと動作するかどうかは不明です。オプションでは、tidyrのどのバージョンを使用している文字列

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