You need to use the standard evaluation versions of the dplyr
functions (just append '_' to the function names, ie. group_by_
& summarise_
) and pass strings to your function, which you then need to turn into symbols. To parameterise the argument of summarise_, you will need to use interp()
, which is defined in the lazyeval
package. Concretely:
library(dplyr)
library(lazyeval)
not.uniq.per.group <- function(df, grp.var, uniq.var) {
df %>%
group_by_(grp.var) %>%
summarise_( n_uniq=interp(~n_distinct(v), v=as.name(uniq.var)) ) %>%
filter(n_uniq > 1)
}
not.uniq.per.group(iris, "Sepal.Length", "Sepal.Width")
Note that in recent versions of dplyr
the standard evaluation versions of the dplyr functions have been "soft deprecated" in favor of non-standard evaluation.
See the Programming with dplyr
vignette for more information on working with non-standard evaluation.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…