Добавить переменные условно - PullRequest
1 голос
/ 08 ноября 2019

Я использую dplyr пакет и хочу создать переменную, только если условие существует. Функция ниже выполняет перекодирование и работает нормально. Я хочу, чтобы эта строка кода !!var := ifelse(is.na(as.numeric(!!var)), 0, !!var) выполнялась, только если в переменной отсутствуют значения. Мне также нужно проверить, является ли имя переменной действительным или нет.

recoding <- function(df, var, interval) {
  var  <- enquo(var)
  var2 <- paste0(as_label(var), '_group')

  df <-  df %>% mutate(
    !!var := ifelse(is.na(as.numeric(!!var)), 0, !!var),
    !!var2 := Hmisc::cut2(!!var, cuts = interval)
  )

  message(var2, " variable has been created")
  return(df)
}

mtcars %>% recoding(mpg, c(0,20,50,Inf))

1 Ответ

0 голосов
/ 09 ноября 2019

Ответ здесь, так как это будет слишком долго для комментария.

Мне кажется, я понимаю, почему вы хотите запускать строку ifelse только тогда, когда в переменной есть NA, чтобы сэкономить время / ресурсы,Но это будет накладные расходы. Вы будете проверять NA в переменной дважды , сначала чтобы проверить, есть ли какие-либо NA, а затем проверить, какие из них NA, чтобы изменить их.

# lets check if the var has NAs (as per @akrun and @Gregor comments)
if (sum(is.na(!!var)) > 0) { # just now you just check all the var values to see if there is NAs
  df <-  df %>% mutate(
    !!var := ifelse(is.na(as.numeric(!!var)), 0, !!var), # And here you are checking again  
    !!var2 := Hmisc::cut2(!!var, cuts = interval)
  )
}

Код какэто идеально. Вы только проверяете это один раз, и если есть какие-либо NA, изменение будет сделано. Если нет, переменная будет такой же. Я знаю, что это нелогично, но попытка выполнить операцию только с переменными, содержащими NA, не сэкономит ваше время или ресурсы, фактически "удвоит" их.

О проверке имени переменной, попробуйте

  # checking if var is valid
  if (!as_label(var) %in% names(df)) {
    stop(as_label(var), ' is not present in df')
  }

непосредственно перед этапом модификации фрейма данных. Таким образом, функция будет выдавать ошибку, если переменная var не находится ни в кадре данных.

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