как передать имя столбца в функцию - PullRequest
0 голосов
/ 19 ноября 2018

Я написал функцию, которая выполняет несколько анализов, включая вычисление меры, называемой «Чистая оценка промоутера», с использованием NPS пакета .

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 голосов
/ 19 ноября 2018

Это потому, что входные данные для функций не оцениваются должным образом -

(обратите внимание, что при реализации здесь функция будет работать независимо от того, введете ли вы простое выражение 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

Создано в 2018-11-18 пакетом Представления (v0.2.1)

0 голосов
/ 19 ноября 2018

Вы можете использовать пакет 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)
...