Часть 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()
.