Как передать переменную в функцию фильтра внутри функции R - PullRequest
0 голосов
/ 18 марта 2019

Я довольно новичок в R. Я написал нижеприведенную функцию, которая пытается суммировать фрейм данных на основе переменной признака (переданной функции как «переменная») и целевой переменной (переданной функции как target_var ). Я также передаю ему значение (target_val) для фильтрации.

Приведенная ниже функция переключается на линию фильтра (filter(target_var == target_val)). Я думаю, что это как-то связано с quo, quosure и т. Д., Но не могу понять, как это исправить. Следующий код должен быть готов к запуску - если вы исключите строку фильтра, она должна работать, если вы включили строку фильтра, она упадет.

library(dplyr)
target <- c('good', 'good', 'bad', 'good', 'good', 'bad')
var_1 <- c('debit_order', 'other', 'other', 'debit_order','debit_order','debit_order')

dset <- data.frame(target, var_1)
odds_by_var <- function(dataframe, variable, target_var, target_val){

  df_name <- paste('odds', deparse(substitute(variable)), sep = "_")
  variable_string <- deparse(substitute(variable))
  target_string <- deparse(substitute(target_var))

  temp_df1 <- dataframe %>%
    group_by_(variable_string, target_string) %>%
    summarise(cnt = n()) %>%
    group_by_(variable_string) %>%
    mutate(total = sum(cnt)) %>%
    mutate(rate = cnt / total) %>%
    filter(target_var == target_val) 

  assign(df_name, temp_df1, envir=.GlobalEnv)

}

odds_by_var(dset, var_1, target, 'bad')

1 Ответ

1 голос
/ 18 марта 2019

, поэтому я предполагаю, что вы хотите фильтровать по цели хорошо или плохо.В моем понимании всегда filter() перед вами group_by(), так как вы, возможно, пропустите переменные фильтра.Я немного перестроил вашу функцию:

    dset <- data.frame(target, var_1)
odds_by_var <- function(dataframe, variable, target_var, target_val){

  df_name <- paste('odds', deparse(substitute(variable)), sep = "_")
  variable_string <- deparse(substitute(variable))
  target_string <- deparse(substitute(target_var))

  temp_df1 <- dataframe %>%
    group_by_(variable_string, target_string) %>%
    summarise(cnt = n()) %>%
    mutate(total = sum(cnt),
           rate = cnt / total) 
names(temp_df1) <- c(variable_string,"target","cnt","total","rate" )
temp_df1 <- temp_df1[temp_df1$target == target_val,]
  assign( df_name,temp_df1, envir=.GlobalEnv)

}

odds_by_var(dset, var_1, target, "bad")

Результат:

> odds_var_1
# A tibble: 2 x 5
# Groups:   var_1 [2]
  var_1       target   cnt total  rate
  <chr>       <chr>  <int> <int> <dbl>
1 debit_order bad        1     4  0.25
2 other       bad        1     2  0.5 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...