如何将列名传递给函数
how to pass a column name to a function
我编写了一个函数,该函数执行一些分析,包括使用 NPS
package.
计算名为 "Net Promoter Score" 的度量
library(dplyr)
library(tidyr)
library(NPS)
df<-data.frame(score = sample(c(0:10),15,replace=TRUE),
variable = sample(c('A', 'B', 'C'),15,replace=TRUE)
)
analyzer <- function(df,var, sco){
df %>% group_by_(var) %>% transmute(n= nps(sco)) %>% unique()
}
analyzer(df,'variable','score')
这returns NA
为各级变量。
现在 dplyr 函数有一种方法可以处理 x
作为字符传递给它们(即我在这里使用的 _
版本),但是 nps
功能没有。我还尝试将分数列作为 nps(.[[score]])
传递,但这 returns 整个列的 NPS 并且不会按 group_by 级别将其分解。
您可以使用 rlang 包,然后使用 !!
取消引用您的变量
library(dplyr)
library(tidyr)
library(NPS)
library(rlang)
df<-data.frame(score = sample(c(0:10),15,replace=TRUE),
variable = sample(c('A', 'B', 'C'),15,replace=TRUE)
)
analyzer <- function(df,var, sco){
var <- rlang::enquo(var)
sco <- rlang::enquo(sco)
df %>% group_by(!!var) %>% transmute(n= nps(!!sco)) %>% unique()
}
analyzer(df, variable,score)
这是因为函数的输入没有得到正确的评估-
(注意这里的实现方式,不管输入的是空表达式x = x
还是字符x = "x"
,函数都会起作用)
library(dplyr)
library(tidyr)
library(NPS)
set.seed(123)
# data
df <- data.frame(score = sample(c(0:10), 15, replace = TRUE),
variable = sample(c('A', 'B', 'C'), 15, replace = TRUE))
# custom function
analyzer <- function(df, var, sco) {
var <- rlang::ensym(var)
sco <- rlang::ensym(sco)
df <- df %>%
group_by(., !!rlang::enquo(var)) %>%
transmute(., n = NPS::nps(!!rlang::enquo(sco))) %>%
unique()
return(df)
}
# using function
analyzer(df, 'variable', 'score')
#> # A tibble: 3 x 2
#> # Groups: variable [3]
#> variable n
#> <fct> <dbl>
#> 1 C -0.333
#> 2 A -0.4
#> 3 B -0.25
由 reprex package (v0.2.1)
于 2018-11-18 创建
我编写了一个函数,该函数执行一些分析,包括使用 NPS
package.
library(dplyr)
library(tidyr)
library(NPS)
df<-data.frame(score = sample(c(0:10),15,replace=TRUE),
variable = sample(c('A', 'B', 'C'),15,replace=TRUE)
)
analyzer <- function(df,var, sco){
df %>% group_by_(var) %>% transmute(n= nps(sco)) %>% unique()
}
analyzer(df,'variable','score')
这returns NA
为各级变量。
现在 dplyr 函数有一种方法可以处理 x
作为字符传递给它们(即我在这里使用的 _
版本),但是 nps
功能没有。我还尝试将分数列作为 nps(.[[score]])
传递,但这 returns 整个列的 NPS 并且不会按 group_by 级别将其分解。
您可以使用 rlang 包,然后使用 !!
取消引用您的变量library(dplyr)
library(tidyr)
library(NPS)
library(rlang)
df<-data.frame(score = sample(c(0:10),15,replace=TRUE),
variable = sample(c('A', 'B', 'C'),15,replace=TRUE)
)
analyzer <- function(df,var, sco){
var <- rlang::enquo(var)
sco <- rlang::enquo(sco)
df %>% group_by(!!var) %>% transmute(n= nps(!!sco)) %>% unique()
}
analyzer(df, variable,score)
这是因为函数的输入没有得到正确的评估-
(注意这里的实现方式,不管输入的是空表达式x = x
还是字符x = "x"
,函数都会起作用)
library(dplyr)
library(tidyr)
library(NPS)
set.seed(123)
# data
df <- data.frame(score = sample(c(0:10), 15, replace = TRUE),
variable = sample(c('A', 'B', 'C'), 15, replace = TRUE))
# custom function
analyzer <- function(df, var, sco) {
var <- rlang::ensym(var)
sco <- rlang::ensym(sco)
df <- df %>%
group_by(., !!rlang::enquo(var)) %>%
transmute(., n = NPS::nps(!!rlang::enquo(sco))) %>%
unique()
return(df)
}
# using function
analyzer(df, 'variable', 'score')
#> # A tibble: 3 x 2
#> # Groups: variable [3]
#> variable n
#> <fct> <dbl>
#> 1 C -0.333
#> 2 A -0.4
#> 3 B -0.25
由 reprex package (v0.2.1)
于 2018-11-18 创建