【问题标题】:R lazyeval: pass parameters to dplyr::filterRlazyeval:将参数传递给 dplyr::filter
【发布时间】:2017-10-16 13:32:42
【问题描述】:

我认为这个问题有多种其他变化形式(例如:here、here 可能还有 here)——甚至可能是某个地方的答案。

如何给过滤函数提供参数。

library(dplyr)
library(lazyeval)
set.seed(10)
data <- data.frame(a=sample(1:10, 100, T))

如果我需要计算数字 1 到 10 的出现次数并显示计数,例如 1、2 和 3,我会这样做:

data %>% 
  group_by(a) %>% 
  summarise(n = n()) %>% 
  filter(a < 4)

给:

# A tibble: 3 × 2
      a     n
  <int> <int>
1     1    11
2     2     8
3     3    16

现在,我怎样才能把它放到一个函数中? 这里grp 是分组变量。

   fun <- function(d, grp, no){
      d %>% 
        group_by_(grp) %>% 
        summarise_(n = interp(~ n() )) %>%
        filter_( grp < no)
        # This final line instead also does not work:  
        # filter_(interp( grp < no), grp = as.name(grp))
    }

现在,

fun(data, 'a', 4)

给予:

# A tibble: 0 × 2
# ... with 2 variables: a <int>, n <int>

【问题讨论】:

    标签: r filter parameters dplyr lazyeval


    【解决方案1】:

    我们可以使用开发版dplyr(即将发布0.6.0)中的quosures方法

    fun <- function(d, grp, no){
       grp <- enquo(grp)
    
       d %>% 
          group_by(UQ(grp)) %>% 
          summarise(n = n() )%>%
           filter(UQ(grp) < no)
    
    }
    
    fun(data, a, 4)
    # A tibble: 3 x 2
    #      a     n
    #  <int> <int>
    #1     1    11
    #2     2     8
    #3     3    16
    

    我们使用enquo 获取输入参数并将其转换为quosure,在group_by/summarise/mutate 内,通过取消引用来评估quosure(UQ 或!!)


    上面的函数也可以修改为同时使用带引号和不带引号的参数

    fun <- function(d, grp, no){
       lst <- as.list(match.call())
       grp <- if(is.character(lst$grp)) {
                  rlang::parse_quosure(grp)
                } else enquo(grp)
    
    
       d %>% 
          group_by(UQ(grp)) %>% 
          summarise(n = n() )%>%
           filter(UQ(grp) < no)
    
    }
    
    
    
    
    fun(data, a, 4)
    # A tibble: 3 x 2
    #      a     n
    #  <int> <int>
    #1     1    11
    #2     2     8
    #3     3    16
    
     fun(data, 'a', 4)
    # A tibble: 3 x 2
    #      a     n
    #  <int> <int>
    #1     1    11
    #2     2     8
    #3     3    16
    

    【讨论】:

    • 这非常聪明,而且语法相当简单——我想我得从 github (@hadley/dplyr) 获取它
    猜你喜欢
    • 2015-07-01
    • 2015-03-14
    • 1970-01-01
    • 2015-04-04
    • 1970-01-01
    • 1970-01-01
    • 2018-01-08
    • 2017-06-06
    相关资源
    最近更新 更多