在我自己的函数中使用summarise_和group_by_

时间:2015-07-31 18:34:07

标签: r dplyr

我想创建一个使用summarise_group_by_函数的简单函数。我知道非标准评估存在问题,但我可以解决它。

library(dplyr)
test_function <- function(.data, ..., variable){
  dots <- quote(mean(substitute(variable)))
    group_by_(.data,.dots = lazyeval::lazy_dots(...)) %>% 
    summarise_(.dots = dots)
}

但是当我尝试这个时:

test_function(ggplot2::diamonds, cut, clarity, variable = price)

它不起作用。

谢谢,

2 个答案:

答案 0 :(得分:5)

您的问题是quote()。报价正在逃避substitute(),因此它没有以您希望的方式运行。如果您使用bquote()代替,您可以评估替代品并将结果插入表达式以获得您想要的内容

test_function <- function(.data, ..., variable){
    dots <- bquote(mean(.(substitute(variable))))
    group_by_(.data,.dots = lazyeval::lazy_dots(...)) %>% 
    summarise_(.dots = dots)
}

test_function(diamonds, cut, clarity, variable = price)
# Source: local data frame [40 x 3]
# Groups: cut
# 
#     cut clarity mean(price)
# 1  Fair      I1    3703.533
# 2  Fair     SI2    5173.916
# 3  Fair     SI1    4208.279
# 4  Fair     VS2    4174.724
# 5  Fair     VS1    4165.141

答案 1 :(得分:0)

使用复杂的短语bquote(mean(.(substitute(variable))))我找到了interp函数,它简化了符号。

...
interp(~mean(variable), variable = substitute(variable))
...