如何从公式中删除NA变量

时间:2019-01-13 16:42:55

标签: r

我在一个循环中有一个动态创建的公式,稍后将在某些模型中使用该公式,例如:

y ~ x1+x4+x7+x13+x15

在某些情况下,由于某些因素,可以包含NA元素:

y ~ x1+x3+NA+x13+NA+x19

我想从公式中删除(省略)NA变量,以便得到:

y ~ x1+x3+x13+x19

在R中执行此操作的方式是什么?我的目的是要获得一个仅包含变量的“干净”公式。

3 个答案:

答案 0 :(得分:3)

我们可以使用all.vars()从公式中提取变量,该公式会自动删除NA作为变量。使用unique=FALSE可确保我们将变量保留在公式中。然后,我们可以简单地paste()将公式重新放回一起。

v <- all.vars(f, unique=FALSE)

v
# [1] "y"   "x1"  "x3"  "x13" "x19"

as.formula(paste(v[1], "~", paste(v[-1], collapse="+")))
# y ~ x1 + x3 + x13 + x19

数据:

f <- y ~ x1 + x3 + NA + x13 + NA + x19

答案 1 :(得分:2)

创建公式时最好避免这种情况。 (例如,在将公式xfoo排除在公式中之前检查NA是否为f <- function(fml){ acf <- as.character(fml) rhs <- trimws(strsplit(acf[3], "+", fixed=TRUE)[[1]]) rhs <- rhs[!rhs %in% "NA"] rhs <- paste(rhs, collapse = " + ") as.formula(paste(acf[2], acf[1], rhs)) } > f(y ~ x1+x3+NA+x13+NA+x19) y ~ x1 + x3 + x13 + x19 <environment: 0x0000000019181808> 。)如果没有它,您将拥有无效的公式,并且可能最简单的处理方法是将其转换为字符,省略NA,然后转换回公式。像这样:

as.formula

请注意,公式也具有环境...因此,如果您决定使用单独的函数来转换您的公式(如上),则返回字符串(例如,跳过as.formula(f(y~bla + NA + bla))最后一行),并在函数返回后将其转换为公式。 (例如print)。或者,您可以更改公式的环境。

答案 2 :(得分:0)

这是一个使用正则表达式删除+NANA+

的解决方案
expr <- y ~ NA+x1+x3+NA+x13+NA+x19+NA
as.formula(gsub("\\+\\s*NA\\s*|\\s*NA\\s*\\+", "" , 
                paste0(deparse(expr), collapse = "")))
#R y ~ x1 + x3 + x13 + x19