r/dplyr: 在 UDF 中使用动态命名的变量
r/dplyr: Using dynamically named variables in UDF
我对使用 dplyr
编写用户定义的函数有些陌生,我想在我的函数中使用动态定义的变量。我已经完成了文档 here and here and 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)
returns下面的错误信息
#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
的第一个输入解释为字符串,但我不知道如何从上面引用先前定义的列。任何指导将不胜感激。
您正确地识别出 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])
}
您可以使用 .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)
我对使用 dplyr
编写用户定义的函数有些陌生,我想在我的函数中使用动态定义的变量。我已经完成了文档 here and here and 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)
returns下面的错误信息
#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
的第一个输入解释为字符串,但我不知道如何从上面引用先前定义的列。任何指导将不胜感激。
您正确地识别出 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])
}
您可以使用 .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)