Я настоятельно рекомендую оставить ваши NA
такими, какие они есть, если вы можете. R имеет встроенные универсальные функции для работы с NA
в разных классах, которые могут значительно облегчить вашу жизнь. Если ваши пропуски обозначены разными значениями для каждого типа данных, вам нужно добавить сравнение для каждого типа пропущенных, что не очень эффективно.
Стоит также отметить, что параметрыниже можно обобщить, то есть они будут работать с фреймами данных с любым количеством столбцов, поэтому вам не нужно добавлять сравнение для каждого нового столбца.
Сначала сгенерируйте некоторые данные для тестирования:
df <- data.frame(num = c(1, 0, 3, 4, 0, 5),
cat = c("a", "b", "c", "d", "MISSING", "MISSING")
)
#### OUTPUT ####
num cat
1 1 a
2 0 b # <- keep
3 3 c
4 4 d
5 0 MISSING # <- drop
6 5 MISSING # <- keep
Вы можете фильтровать, используя базу R или dplyr
(среди других опций):
# Base R option
df[rowSums(df == "MISSING" | df == 0) < ncol(df),]
# Tidyverse option using dplyr
library(dplyr)
filter_all(df, any_vars(!(. == "MISSING" | . == 0)))
Вывод для обеих опций будет выглядеть следующим образом:
num cat
1 1 a
2 0 b # <- kept
3 3 c
4 4 d
5 5 MISSING # <- kept
Просто ради аргумента, вот как вы можете упростить вещи, оставив NA
s как есть. Сначала некоторые новые данные:
df_na <- data.frame(num = c(1, NA, 3, 4, NA, 5),
cat = c("a", "b", "c", "d", NA, NA)
)
#### OUTPUT ####
num cat
1 1 a
2 NA b # <- keep
3 3 c
4 4 d
5 NA <NA> # <- drop
6 5 <NA> # <- keep
Теперь мы можем использовать те же стратегии, что и выше, но нам нужно только использовать is.na()
вместо добавления сравнения для каждого типа пропущенных значений:
# Using base R
df_na[rowSums(is.na(df_na)) < ncol(df_na),]
# Using dplyr
library(dplyr)
filter_all(df_na, any_vars(!is.na(.)))
#### OUTPUT ####
num cat
1 1 a
2 NA b # <- kept
3 3 c
4 4 d
6 5 <NA> # <- kept