R 有条件地添加变量

R 有条件地添加变量,r,dplyr,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

我正在使用
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))

重新编码在这里回答,因为这对评论来说太长了

我想我理解了为什么只有在变量中有NAs时才运行
ifelse
行,以节省时间/资源。但这将是一个开销。您将在变量中测试两次NAs,首先检查是否有NAs,然后检查哪些是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)
  )
}

就在数据帧修改步骤之前。这样,如果变量var不在数据框中,函数将抛出并出错。

在这里回答,因为这对于注释来说太长了

我想我理解了为什么只有在变量中有NAs时才运行
ifelse
行,以节省时间/资源。但这将是一个开销。您将在变量中测试两次NAs,首先检查是否有NAs,然后检查哪些是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)
  )
}

就在数据帧修改步骤之前。这样,如果变量var不在数据帧中,函数将抛出并出错。

您可以通过检查
sum(is.na(!!var))>0
ifelse
被向量化,来添加
if/else
语句-它将检查向量的每个元素,并返回相同长度的向量。这是一个控制流需要,所以您希望
if(){}else{}
不是
ifelse()
,代码类似于akrun的注释。如果else{}不能在mutate()下工作,您可以将
mutate
包装在
if()
if(anyNA(df[,var]){df%mutate…}
。您可以通过检查
sum(is.na(!!var))>0添加
if/else
语句
ifelse
是向量化的-它将检查向量的每个元素,并返回相同长度的向量。这是控制流的需要,因此您需要
if(){}else{/code>而不是
ifelse()
,代码类似于akrun的注释。如果else{}无法在mutate()下工作,则将
mutate
包装在
If()
If(anyNA(df[,var]){df%mutate…}
中。