У вас проблема с levels
вашего вектора. Я не знаю, как он был создан (при условии, что это было сделано программно), но давайте составим аналогичный вектор и покажем, почему он не соответствует вашим тестам.
Во-первых, factor
- это просто integer
вектор с двумя отличиями: атрибут "levels"
, который представляет собой строковый вектор уровней; и он классифицируется как "factor"
.
dput(factor(letters[1:3]))
# structure(1:3, .Label = c("a", "b", "c"), class = "factor")
Давайте сконструируем его вручную:
vec <- 1:3
attr(vec, "levels") <- c("A", "B", NA, "D")
vec
# [1] 1 2 3
# attr(,"levels")
# [1] "A" "B" NA "D"
Еще не фактор, поэтому целые числа по-прежнему показывают не- NA
.
class(vec) <- "factor"
vec
# [1] A B <NA>
# Levels: A B <NA> D
dput(vec)
# structure(c(1L, 2L, NA), .Label = c("A", "B", NA, "D"), class = "factor")
attributes(vec)
# $levels
# [1] "A" "B" NA "D"
# $class
# [1] "factor"
Итак, мы ничего не сделали с целыми числами внутри vec
, но теперь одно из них отображается как NA
. Интересно.
К сожалению, мы знаем, что под классом factor
числа по-прежнему 1, 2 и 3, а не NA
, поэтому мы не должны быть полностью удивлены этим:
is.na(vec)
# [1] FALSE FALSE FALSE
as.integer(vec)
# [1] 1 2 3
Чтобы узнать, какие из vec
ссылок и NA
, однако,
as.character(vec)
# [1] "A" "B" NA
is.na(as.character(vec))
# [1] FALSE FALSE TRUE
И выяснить, какой из уровней is NA
:
is.na(levels(vec))
# [1] FALSE FALSE TRUE FALSE
Если вы хотите заменить level на NA
, вы можете попробовать следующее:
lvls <- levels(vec)
lvls[is.na(lvls)] <- "NOT AVAILABLE"
levels(vec) <- lvls
vec
# [1] A B NOT AVAILABLE
# Levels: A B NOT AVAILABLE D
( Мне никогда не нравилось, как факторы отображаются без кавычек, так как Levels:
выше может быть расплывчатым.)
Кстати, многие из вспомогательных функций пытаются удержать вас от этого. Например:
vec <- 1:3
attr(vec, "levels") <- LETTERS[1:4]
class(vec) <- "factor"
dput(vec)
# structure(1:3, .Label = c("A", "B", "C", "D"), class = "factor")
attr(vec, "levels") <- c("A", "B", NA, "D")
dput(vec)
# structure(1:3, .Label = c("A", "B", NA, "D"), class = "factor")
Обратите внимание, что у нас есть (i) все еще целые числа от 1 до 3; и (ii) уровень NA
. Однако если мы сделаем это формально,
levels(vec) <- c("A", "B", NA, "D")
dput(vec)
# structure(c(1L, 2L, NA), .Label = c("A", "B", "D"), class = "factor")
мы потеряем одно из наших целых чисел! И мы потеряли уровень NA
.