如何将列名传递给函数

时间:2018-11-19 03:42:09

标签: r function dplyr rlang

我编写了一个函数,该函数进行了一些分析,包括使用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')

这将为所有级别的变量返回NA

现在dplyr函数可以处理x作为字符传递给它们的方式(即,我在这里使用的_版本),但是nps函数却没有没错我还尝试将分数列传递为nps(.[[score]]),但这会返回整个列的NPS,并且不会按group_by级别对其进行细分。

2 个答案:

答案 0 :(得分:6)

您可以使用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)

答案 1 :(得分:1)

这是因为未正确评估函数的输入-

(请注意,此处实现该方法的功能将起作用,而不管您输入的是裸表达式idx = 0 end = len(lst) while idx < end: temp1 = int(lst[idx][1]) temp2 = int(lst[idx][2]) idx += 1 还是字符x = x

x = "x"

reprex package(v0.2.1)于2018-11-18创建