我在一个循环中有一个动态创建的公式,稍后将在某些模型中使用该公式,例如:
y ~ x1+x4+x7+x13+x15
在某些情况下,由于某些因素,可以包含NA元素:
y ~ x1+x3+NA+x13+NA+x19
我想从公式中删除(省略)NA变量,以便得到:
y ~ x1+x3+x13+x19
在R中执行此操作的方式是什么?我的目的是要获得一个仅包含变量的“干净”公式。
答案 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)
这是一个使用正则表达式删除+NA
或NA+
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