【问题标题】:Passing parameters into function that uses dplyr将参数传递给使用 dplyr 的函数
【发布时间】:2017-10-23 12:29:47
【问题描述】:

我有以下函数来描述一个变量

library(dplyr)
describe = function(.data, variable){
  args <- as.list(match.call())
  evalue = eval(args$variable, .data)
  summarise(.data,
            'n'= length(evalue),
            'mean' = mean(evalue),
            'sd' = sd(evalue))
}

我想使用dplyr 来描述变量。

set.seed(1)
df = data.frame(
  'g' = sample(1:3, 100, replace=T),
  'x1' = rnorm(100),
  'x2' = rnorm(100)
)
df %>% describe(x1)
#     n        mean        sd
# 1 100 -0.01757949 0.9400179

问题是当我尝试使用函数group_by 应用相同的描述时,描述函数并未应用于每个组

df %>% group_by(g) %>% describe(x1)
# # A tibble: 3 x 4
#       g     n        mean        sd
#   <int> <int>       <dbl>     <dbl>
# 1     1   100 -0.01757949 0.9400179
# 2     2   100 -0.01757949 0.9400179
# 3     3   100 -0.01757949 0.9400179

您将如何更改函数以通过少量修改获得所需的内容?

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    你需要 tidyeval:

    describe = function(.data, variable){
      evalue = enquo(variable)
      summarise(.data,
                'n'= length(!!evalue),
                'mean' = mean(!!evalue),
                'sd' = sd(!!evalue))
    }
    
    df %>% group_by(g) %>% describe(x1)
    # A tibble: 3 x 4
          g     n        mean        sd
      <int> <int>       <dbl>     <dbl>
    1     1    27 -0.23852862 1.0597510
    2     2    38  0.11327236 0.8470885
    3     3    35  0.01079926 0.9351509
    

    dplyr vignette 'Programming with dplyr' 对使用 enquo!! 进行了详尽的描述

    编辑:

    针对 Axeman 的评论,我不是 100%为什么 group_by 和 describe 在这里不起作用。 但是,使用 debugonce 和原始形式的功能

    debugonce(describe)
    
    df %>% group_by(g) %>% describe(x1)
    

    可以看到evalue没有分组,只是一个长度为100的数值向量。

    【讨论】:

    • 这个答案可以通过解释为什么OP的版本不起作用来改进。
    • 不错!我不知道enquo 功能。谢谢!
    • 重新编辑:确切地说,OPs evalue 只是一个向量,与分组无关。 summarise 然后只是为每个组分配该向量的长度(等),因为该 evalue 的上下文在分组的 data.frame 之外。
    【解决方案2】:

    Base NSE 似乎也可以工作:

    describe <- function(data, var){
    
      var_q <- substitute(var)
      data %>% 
        summarise(n = n(),
                  mean = mean(eval(var_q)),
                  sd = sd(eval(var_q)))
    }
    
    
    df %>% describe(x1) 
    
       n       mean       sd
    1 100 -0.1266289 1.006795
    
    
    
    df %>% group_by(g) %>% describe(x1)
    # A tibble: 3 x 4
          g     n       mean       sd
      <int> <int>      <dbl>    <dbl>
    1     1    33 -0.1379206 1.107412
    2     2    29 -0.4869704 0.748735
    3     3    38  0.1581745 1.020831
    

    【讨论】:

      猜你喜欢
      • 2015-03-14
      • 1970-01-01
      • 2018-01-08
      • 2017-06-06
      • 2015-07-01
      • 2018-05-09
      • 1970-01-01
      相关资源
      最近更新 更多