Как передать переменную в функцию фильтрации внутри R-функции

#r #function #dplyr

#r #функция #dplyr

Вопрос:

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

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

 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:

итак, я предполагаю, что вы хотите выполнить фильтрацию по целевому значению good или bad. В моем понимании, всегда 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 
  

Комментарии:

1. Привет, большое спасибо за ваш ответ. Однако я не уверен, что это сработает, поскольку мне нужно вычислить ‘cnt’ и ‘total’ перед фильтрацией ‘товаров’. Итак, ответ, который я ожидаю, таков…

2. code var_1 cnt общая скорость <fct> <int> <int> <dbl> 1 debit_order 1 4 0,25 2 other 1 2 0,5 code

3. Извините, я все еще пытаюсь выяснить, как правильно форматировать мои ответы. В основном я ожидаю, что количество заказов на дебетование будет равно 1, общее количество заказов на дебетование будет равно 4, а коэффициент будет равен 0,25. Для ‘other’ это будет 1, 2 и 0.5 соответственно.

4. Привет, извините за поздний ответ. Да, теперь это действительно помогает. Большое спасибо, это действительно полезно, хорошо сделано. С уважением, Джон