2017-05-24 15 views
2

これは、Real Soon Nowでリリースされる新しいdplyrに含まれています。 dplyr programming vignettedplyrでプログラムで指定された複数の変数をグループ化する。0.6

は、外側の関数で指定されたグループ化変数とgroup_byを呼び出す例を与える:

my_summarise <- function(df, group_var) { 
    df %>% 
    group_by(!!group_var) %>% 
    summarise(a = mean(a)) 
} 

単一のグループ化変数が供給されるとこれが動作します。ただし、複数の変数で失敗します。

簡体例:

f <- function(x) 
{ 
    group_by(mtcars, !!x) 
} 

## works 
g1 <- "cyl" 
f(g1) 

## doesn't work 
#Error in mutate_impl(.data, dots) : 
# Column `c("cyl", "gear")` must be length 32 (the number of rows) or one, not 2 
g2 <- c("cyl", "gear") 
f(g2) 

どのように私はrlangの枠組みの中で、この問題を解決することができますか?

理想的にはfのシグネチャを同じままにします。すなわち、グループ化変数を...引数ではなく1つのベクトルとして指定します。

+0

実際、 'f(g1)'はうまく動作しません。 'f(g1)%>%summarize(n = n())'を試してください。 – JasonWang

答えて

1

かなり類似した質問がありました:Programming with dplyr using string as input。私はちょうどsyms!!!を使用する答えを少し変更しました。

library(rlang) 
f <- function(x){ 
    group_by(mtcars, !!!syms(x)) 
} 

f(c("cyl")) %>% summarise(n()) 
# A tibble: 3 x 2 
    cyl `n()` 
    <dbl> <int> 
1  4 11 
2  6  7 
3  8 14 

f(c("cyl", "gear")) %>% summarise(n()) 
# A tibble: 8 x 3 
# Groups: cyl [?] 
    cyl gear `n()` 
    <dbl> <dbl> <int> 
1  4  3  1 
2  4  4  8 
3  4  5  2 
4  6  3  2 
5  6  4  4 
6  6  5  1 
7  8  3 12 
8  8  5  2 
関連する問題