【问题标题】:r/dplyr: Using dynamically named variables in UDFr/dplyr:在 UDF 中使用动态命名的变量
【发布时间】:2021-01-16 23:46:58
【问题描述】:

我对使用dplyr 编写用户定义的函数有点陌生,我想在我的函数中使用动态定义的变量。我已经通过文档 hereherehere 获得了其中的一部分,但我担心我可能没有正确的命名法来找到我想要做的事情。

我想定义一个函数,它在mutate 调用中创建一个变量,然后在其他调用中使用该变量。例如,

library(tidyverse)
library(PropCIs)

for_share_plot <- function(data, dummy, group_var){

    dummy_sum <- paste0(quo_name(enquo(dummy)), "_sum")

    data %>% 
       mutate("{{dummy}}_sum" := sum({{dummy}})) %>% 
       mutate("{{dummy}}_prop" := (!!dummy_sum)/{{group_var}},
              "{{dummy}}_lowerci" := scoreci(!!dummy_sum, {{group_var}}, conf.level = 0.95)$conf.int[1],
              "{{dummy}}_upperci" := scoreci(!!dummy_sum, {{group_var}}, conf.level = 0.95)$conf.int[2])
}

df <- mtcars %>%
    add_count(cyl, name = 'group_n') %>%
    group_by(cyl) %>%
    for_share_plot(data = ., dummy = am, group_var = group_n)

返回以下错误信息

#Error: Problem with `mutate()` input `am_prop`.
#x non-numeric argument to binary operator
#ℹ Input `am_prop` is `"am_sum"/group_n`.
#ℹ The error occured in group 1: cyl = 4.

我知道它将{{dummy}}_prop 的第一个输入解释为字符串,但我不知道如何从上面引用先前定义的列。任何指导将不胜感激。

【问题讨论】:

    标签: r dplyr user-defined-functions


    【解决方案1】:

    您正确识别出dummy_sum 是一个字符串,因此您可以将其转换为!! 可以使用sym() 命令计算的符号。

    尝试对您的代码进行以下修改:

    for_share_plot <- function(data, dummy, group_var){
    
        dummy_sum <- sym(paste0(quo_name(enquo(dummy)), "_sum"))
    
        data %>% 
           mutate("{{dummy}}_sum" := sum({{dummy}})) %>% 
           mutate("{{dummy}}_prop" := (!!dummy_sum)/{{group_var}},
                  "{{dummy}}_lowerci" := scoreci(!!dummy_sum, {{group_var}}, conf.level = 0.95)$conf.int[1],
                  "{{dummy}}_upperci" := scoreci(!!dummy_sum, {{group_var}}, conf.level = 0.95)$conf.int[2])
    }
    

    【讨论】:

      【解决方案2】:

      您可以使用.data 代词来指代列名。

      library(dplyr)
      library(PropCIs)
      
      for_share_plot <- function(data, dummy, group_var){
        
        dummy_sum <- paste0(quo_name(enquo(dummy)), "_sum")
        
        data %>% 
          mutate("{{dummy}}_sum" := sum({{dummy}}),
                 "{{dummy}}_prop" := .data[[dummy_sum]]/{{group_var}},
                 "{{dummy}}_lowerci" := scoreci(.data[[dummy_sum]], {{group_var}}, conf.level = 0.95)$conf.int[1],
                 "{{dummy}}_upperci" := scoreci(.data[[dummy_sum]], {{group_var}}, conf.level = 0.95)$conf.int[2])
      }
      
      mtcars %>%
        add_count(cyl, name = 'group_n') %>%
        group_by(cyl) %>%
        for_share_plot(dummy = am, group_var = group_n)
      

      【讨论】:

        猜你喜欢
        • 2018-05-06
        • 1970-01-01
        • 1970-01-01
        • 2014-01-18
        • 2018-09-13
        • 2017-01-08
        • 2021-10-02
        • 2017-06-10
        • 1970-01-01
        相关资源
        最近更新 更多