Мутирование не работает должным образом внутри пользовательских функций - PullRequest
1 голос
/ 23 июня 2019

Новое в использовании семейства TidyVerse в R. Попытка использовать mutate внутри функции для классификации строк переменной как положительных или отрицательных.Работает нормально вне моего вызова функции, но строго возвращает ноль в нем.

Возможность заставить функцию работать как задумано, когда я не использую mutate, но я хотел бы понять проблемы, с которыми я сталкиваюсь.Я могу сказать, что проблема в том, что я передаю строку для функции.Я возился с различными вещами, такими как as.name (), quo () и UQ, но я не достиг успеха.Не очень понимаю, как лучше всего использовать глаголы Dplyr в функции - Должен ли я просто вернуться к более нормальному синтаксису?

find_if_maj <- function(var_name,curr_year,k_i) {

  if(var_name == "unemp_chg") {
    temp <- agg_econ %>% select(year,var_name) %>% # Subsetting to the desired variable
      filter((year <= curr_year) & (year >= (curr_year - k_i))) %>% # Subsetting to the desired range of years
      mutate(indicator = ifelse(var_name <= 0, 1, 0)) # Creating a dummy indicator based on if the value is negative or positive
    return(temp) # Just returning the tibble for bug checking

  }

}

find_if_maj("unemp_chg",1970,5) %>% mutate(outsidefunc = ifelse(unemp_chg <= 0, 1, 0)) # Running the function, displaying what result should be


Я ожидаю, что столбец индикатора, созданный mutate, будет заполнен 1 и 0 в зависимости от введенного значения.Столбец индикатора, созданный функцией, просто возвращает 0 независимо от входного значения, но столбец outside_func, сгенерированный мной для проверки правильности, возвращает правильные значения.

1 Ответ

1 голос
/ 23 июня 2019

Внутри вашей функции var_name - строка, но вы хотите, чтобы она была ссылкой на имя вашего столбца.Попробуйте это

find_if_maj <- function(var_name,curr_year,k_i) {

  if(var_name == "unemp_chg") {
    temp <- agg_econ %>% select(year,var_name) %>% # Subsetting to the desired variable
      filter((year <= curr_year) & (year >= (curr_year - k_i))) %>% # Subsetting to the desired range of years
      mutate(indicator = ifelse(!!sym(var_name) <= 0, 1, 0)) # Creating a dummy indicator based on if the value is negative or positive
    return(temp) # Just returning the tibble for bug checking

  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...