Удаление строк в R исказило набор данных
Я удалил определенные строки из своей базы данных, используя следующий код:
df2 <- df1[!(df1$variable==1), ]
Это была фиктивная переменная, и строки со значением 1 для этой конкретной фиктивной переменной были успешно удалены. (Я проверил размеры моей базы данных с помощью функции "dim" до и после; и все выглядело нормально.)
Однако после того, как я запустил свою регрессионную модель на этот раз с новым набором данных "df2", я увидел, что степени свободы резко упали! Это было намного больше количества удаленных строк!
Я задавался вопросом, как это могло случиться. Затем я понял, что в новом наборе данных было много строк, в которых были только NA. В каждой строке, в которой случайная переменная имела пропущенное значение, R составляла полный ряд значений NA.
Поняв, что приведенный выше код был не лучшим способом удаления строк, я попробовал следующее:
df2 <- df1[(df1$variable==0 | is.na(df1$variable)), ]
Кажется, сработало, так как у меня больше нет той же проблемы. Но могли бы вы сказать, что у этого нового кода выше могут быть некоторые (похожие или другие) проблемы, о которых я сейчас не знаю?
1 ответ
Новый код должен быть в порядке. Проблема со старым кодом была вызвана комбинацией NA
в df1$variable
и ==
оператор сравнения.
Если вы читаете справку по операторам сравнения, ?"=="
вы увидите, что "отсутствующие значения (NA) и значения NaN считаются несопоставимыми даже для самих себя, поэтому сравнения с ними всегда приводят к NA".
В вашем случае, когда переменная df1$ была NA
результаты вашей попытки подмножества были NA
(не TRUE
или же FALSE
), в результате чего другие переменные в строке были NA
, Например:
df1 <- expand.grid(variable=c(0, 1, NA), var2=c(0, 1, NA))
sel1 <- !(df1$variable==1)
sel1
df1[sel1, ]
sel2 <- df1$variable==0 | is.na(df1$variable)
sel2
df1[sel2, ]