有条件地添加变量

时间:2019-11-08 20:58:30

标签: r dplyr

我正在使用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 :(得分:0)

在这里回答,因为评论太长了。

我想我理解为什么只在变量中包含NA时才运行ifelse行,以节省时间/资源。但这将是开销。您将在变量两次中测试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)
  )
}

完美的代码。您只需检查一次即可,如果不适用,将进行更改。如果不是,则变量将相同。我知道这是违反直觉的,但是仅在包含NAs的变量中执行操作不会节省您的时间或资源,实际上,这会使它们“加倍”。

关于变量名检查,请尝试

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

就在数据帧修改步骤之前。这样,如果变量var不在数据帧中,该函数将引发错误。