Как удалить переменные NA из формулы - PullRequest
0 голосов
/ 13 января 2019

У меня есть динамически созданная формула в цикле, которая позже используется в некоторых моделях, например:

y ~ x1+x4+x7+x13+x15

В определенных обстоятельствах элементы NA могут быть включены из-за некоторых факторов:

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

Я бы хотел исключить (пропустить) переменные NA из формулы, чтобы я получил:

y ~ x1+x3+x13+x19

Как это сделать в R? Моя цель - получить «чистую» формулу, содержащую только переменные.

Ответы [ 3 ]

0 голосов
/ 13 января 2019

Мы можем использовать 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
0 голосов
/ 14 января 2019

Вот решение, которое использует регулярное выражение для удаления +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
0 голосов
/ 13 января 2019

Было бы лучше избежать этого при создании формулы. (Например, проверьте, если xfoo равно NA, прежде чем включить ее в формулу.) Без нее у вас будет недопустимая формула, и, возможно, самый простой способ ее обработки - преобразовать ее в символ, опустить 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>

Обратите внимание, что в формуле также есть среда ... поэтому, если вы решите использовать отдельную функцию для преобразования формулы (как описано выше), может быть полезно вернуть строку символов (т.е. пропустить as.formula в последнем строка) и преобразовать его в формулу, когда функция вернулась. (Например, as.formula(f(y~bla + NA + bla))). Кроме того, вы можете изменить среду формулы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...