2017-07-26 38 views
0

使用[R 3.2.2dplyr 0.7.2我试图找出如何有效地使用group_by作为与特征向量供应领域。GROUP_BY非标字符向量使用tidyeval

选择是容易我可以像经由多个串通过长度> 1这样一个字符向量此

(function(field) { 
    mpg %>% dplyr::select(field) 
})("cyl") 

多个字段这样

(function(...) { 
    mpg %>% dplyr::select(!!!quos(...)) 
})("cyl", "hwy") 

和多个字段经由串选择一个字段

(function(fields) { 
    mpg %>% dplyr::select(fields) 
})(c("cyl", "hwy")) 

With group_by我无法真正找到一种方法来处理多个字符串,因为如果我设法得到一个输出,它最终会由我提供的字符串进行分组。

我设法组由一个字符串这样

(function(field) { 
    mpg %>% group_by(!!field := .data[[field]]) %>% tally() 
})("cyl") 

这已经是相当难看。

有谁知道我必须写这样我就可以运行

(function(field) {...})("cyl", "hwy") 

(function(field) {...})(c("cyl", "hwy")) 

分别?我尝试了各种各样的组合!!,!!!,UQ,enquo,quos,unlist等等,并将它们保存在中间变量中,因为它有时似乎有所作为,但却无法让它起作用。

回答

2

select()在dplyr中很特别。它不接受,但列名称职位。这就是接受字符串的唯一主动词。 (从技术上讲,当你提供一个像cyl这样的裸号名称时,它实际上会被评估为自己的名称,而不是数据帧中的矢量。)

如果您希望函数采用简单的字符串,表达式或符号,你不需要quards。只要创建从串符号和解除引用它们:

myselect <- function(...) { 
    syms <- syms(list(...)) 
    select(mtcars, !!! syms) 
} 
mygroup <- function(...) { 
    syms <- syms(list(...)) 
    group_by(mtcars, !!! syms) 
} 

myselect("cyl", "disp") 
mygroup("cyl", "disp") 

要调试unquoting,与expr()包裹,并检查表达期待权:

syms <- syms(list("cyl", "disp")) 
expr(group_by(mtcars, !!! syms)) 
#> group_by(mtcars, cyl, disp) # yup, looks right! 

看到这个聊了更多关于这个(我们”将更新编程小插图以使这些概念更清晰):https://schd.ws/hosted_files/user2017/43/tidyeval-user.pdf

最后请注意,许多动词有接受字符串和特征向量没有大惊小怪一个_at后缀的变体:

group_by_at(mtcars, c("cyl", "disp")) 
+0

好极了,感谢这么多的快速解答! –