r/dplyr:在 UDF 中使用动态命名的变量

Posted

技术标签:

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

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

我想定义一个函数,它在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 的第一个输入解释为字符串,但我不知道如何从上面引用先前定义的列。任何指导将不胜感激。

【问题讨论】:

【参考方案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)

【讨论】:

以上是关于r/dplyr:在 UDF 中使用动态命名的变量的主要内容,如果未能解决你的问题,请参考以下文章

R dplyr:使用字符串函数重命名变量

具有动态变量名称的 r dplyr 过滤器

在 for 循环中保存动态命名的变量

在 UDF 中使用命名范围

通过公式或 UDF 定义命名范围

通过在 SAS 中用另一个前缀替换前缀来动态重命名变量