Как работать со значениями NA в категориальной переменной? - PullRequest
1 голос
/ 06 февраля 2020

У меня странная проблема, и я надеюсь, что кто-то может помочь. У меня есть фактическая переменная с 8 классами (уровнями), как в R:

> levels(data_testing$land_cover)
[1] "COMMERCIAL"                   "GOVERNMENT AND INSTITUTIONAL" "NOT AVAILABLE"              
[4] "OPEN AREA"                    "PARKS AND RECREATIONAL"       "RESIDENTIAL"                
[7] "RESOURCE AND INDUSTRIAL"      NA 

, как вы можете видеть, это показывает, что NA - это один из уровней переменной "land_cover. И частота уровни выглядят следующим образом:

COMMERCIAL GOVERNMENT AND INSTITUTIONAL                NOT AVAILABLE
                         236                          150                          469
                   OPEN AREA       PARKS AND RECREATIONAL                  RESIDENTIAL
                         908                          108                         6034
     RESOURCE AND INDUSTRIAL                         <NA>
                        1584                         2505

Таким образом, он говорит, что существует 2505 значений NA. Однако, когда я вычисляю общее недостающее значение такой переменной, он показывает, что ее нет:

sum (is.na(data_testing$land_cover))
[1] 0

У меня вопрос, если кто-нибудь знает, как я могу переименовать, переоценить это NA? Я пытался заменить или переименовать NA на что-то другое, но NA s не может быть идентифицирован как уровень.

Моя конечная цель - добавить все значения NA в класс "НЕ ДОСТУПНО" и избавиться от класса * 1016. * Но, очевидно, в функциях замены или переоценки NA не может быть распознан как класс.

Я заранее оценил вашу помощь.

Приветствия-

1 Ответ

0 голосов
/ 06 февраля 2020

У вас проблема с 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.

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