我正在使用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))
答案 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不在数据帧中,该函数将引发错误。