#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,5code
3. Извините, я все еще пытаюсь выяснить, как правильно форматировать мои ответы. В основном я ожидаю, что количество заказов на дебетование будет равно 1, общее количество заказов на дебетование будет равно 4, а коэффициент будет равен 0,25. Для ‘other’ это будет 1, 2 и 0.5 соответственно.
4. Привет, извините за поздний ответ. Да, теперь это действительно помогает. Большое спасибо, это действительно полезно, хорошо сделано. С уважением, Джон