Используйте вставить и! Is.na для подмножества фрейма данных - PullRequest
0 голосов
/ 02 июля 2018

Я пытаюсь определить подмножество кадра данных для стандартной модели lm, используя цикл for. В выражении подмножества я хочу сослаться на col1, используя вставку и подмножество всех наблюдений, где col1-3 не является NA. Я пробовал следующие вещи, но они не работают:

    for(i in 1:3) {
lm(y ~ x1 + x2, data=subset(df, x3="Y" & !is.na(paste0("col", i))))
}

ИЛИ определите имя отдельно:

    for(i in 1:3) {
colname <- as.name(paste0("col", i))
lm(y ~ x1 + x2, data=subset(df, x3="Y" & !is.na(colname)))
}

Кстати: это упрощенный код, иллюстрирующий то, что я пытаюсь сделать. Код в моем скрипте не выдает ошибку, но игнорирует условие! Is.na выражения подмножества. Тем не менее, это работает, если сделано вручную, как это:

    lm(y ~ x1 + x2, data=subset(df, x3="Y" & !is.na(col1)))

Буду очень признателен за совет!

Заранее спасибо!

FK

1 Ответ

0 голосов
/ 02 июля 2018

Часть is.na() игнорируется, потому что то, что вы думаете, оценивается, не то, что оценивается. Что оценивается:

!is.na("col1")

и строка "col1", очевидно, не NA, поэтому она оценивается как TRUE и перерабатывается для всех строк в ваших данных. Проблема, с которой вы столкнулись, заключается в том, что у вас есть имя переменной, хранящееся в виде строки, и subset() нужен логический вектор. Таким образом, вам нужен способ использовать имя вашей переменной, хранящееся в строке, и использовать его для получения соответствующего оцененного логического вектора, который необходим subset(). Вы можете обновить свой код, чтобы использовать что-то вроде:

for(i in 1:3) {
  lm(y ~ x1 + x2, data=subset(df, x3=="Y" & !is.na(df[[paste0("col", i)]])))
}

Хотя это не оптимально, есть и другие способы, которыми вы можете и, вероятно, должны обновить свой код. Что-то вроде:

for(i in 1:3) {
  lm(y ~ x1 + x2, data = df,
    subset = df$x3 == "Y" & !is.na(df[[paste0("col", i)]]))
}

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

У вас все еще есть проблема, что вы нигде не сохраняете результаты вашего звонка на lm().

...