Поиск…


Вступление

Когда мы не знаем значения, которое принимает переменная, мы говорим, что ее значение отсутствует, обозначенное NA .

замечания

Недостающие значения представлены символом NA (недоступно). Невозможные значения (например, в результате sqrt(-1) ) представлены символом NaN (а не числом).

Изучение недостающих данных

anyNA сообщает, присутствуют ли отсутствующие значения; while is.na сообщает пропущенные значения elementwise:

vec <- c(1, 2, 3, NA, 5)

anyNA(vec)
# [1] TRUE
is.na(vec)
# [1] FALSE FALSE FALSE  TRUE FALSE

ìs.na возвращает логический вектор, который принуждается к целочисленным значениям при арифметических операциях (с FALSE = 0, TRUE = 1). Мы можем использовать это, чтобы узнать, сколько недостающих значений есть:

sum(is.na(vec))
# [1] 1

Расширяя этот подход, мы можем использовать colSums и is.na в кадре данных для подсчета NA для каждого столбца:

colSums(is.na(airquality))
#   Ozone Solar.R    Wind    Temp   Month     Day 
#      37       7       0       0       0       0 

Пакет naniar (в настоящее время на github, но не CRAN) предлагает дополнительные инструменты для изучения отсутствующих значений.

Чтение и запись данных с значениями NA

При чтении табличных наборов данных с функциями read.* R автоматически ищет отсутствующие значения, которые выглядят как "NA" . Однако отсутствующие значения не всегда представлены NA . Иногда точка ( . ), Дефис ( - ) или значение символа (например: empty ) указывает, что значение равно NA . Параметр na.strings функции read.* Может использоваться для na.strings R, символы / символы которых должны рассматриваться как значения NA :

read.csv("name_of_csv_file.csv", na.strings = "-")

Также можно указать, что более одного символа необходимо читать как NA :

read.csv('missing.csv', na.strings = c('.','-'))

Аналогично, NA s может быть написано с помощью настраиваемых строк, используя аргумент na для write.csv . Другие инструменты для чтения и записи таблиц имеют аналогичные варианты.

Использование NA разных классов

Символ NA для logical отсутствующего значения:

class(NA)
#[1] "logical"

Это удобно, так как оно легко может быть принудительно применено к другим типам атомных векторов и поэтому обычно является единственным NA вам понадобится:

x <- c(1, NA, 1)
class(x[2])
#[1] "numeric"

Если вам нужно одно значение NA другого типа, используйте NA_character_ , NA_integer_ , NA_real_ или NA_complex_ . Для отсутствующих значений причудливых классов обычно NA_integer_ подмножество с NA_integer_ ; например, для получения отсутствующего значения Дата:

class(Sys.Date()[NA_integer_])
# [1] "Date"

TRUE / FALSE и / или NA

NA является логическим типом, а логический оператор с NA возвращает NA если результат неоднозначен. Ниже NA OR TRUE оценивает значение TRUE потому что по крайней мере одна сторона оценивает значение TRUE , но NA OR FALSE возвращает NA потому что мы не знаем, было ли NA TRUE или FALSE

NA | TRUE
# [1] TRUE  
# TRUE | TRUE is TRUE and FALSE | TRUE is also TRUE.

NA | FALSE
# [1] NA  
# TRUE | FALSE is TRUE but FALSE | FALSE is FALSE.

NA & TRUE
# [1] NA  
# TRUE & TRUE is TRUE but FALSE & TRUE is FALSE.

NA & FALSE
# [1] FALSE
# TRUE & FALSE is FALSE and FALSE & FALSE is also FALSE.

Эти свойства полезны, если вы хотите подмножить набор данных на основе некоторых столбцов, содержащих NA .

df <- data.frame(v1=0:9, 
                 v2=c(rep(1:2, each=4), NA, NA), 
                 v3=c(NA, letters[2:10]))

df[df$v2 == 1 & !is.na(df$v2), ]
#  v1 v2   v3
#1  0  1 <NA>
#2  1  1    b
#3  2  1    c
#4  3  1    d

df[df$v2 == 1, ]
     v1 v2   v3
#1     0  1 <NA>
#2     1  1    b
#3     2  1    c
#4     3  1    d
#NA   NA NA <NA>
#NA.1 NA NA <NA>

Опускание или замена отсутствующих значений

Перекодирование отсутствующих значений

Регулярно отсутствующие данные не кодируются как NA в наборах данных. Например, в SPSS отсутствующие значения часто представлены значением 99 .

num.vec <- c(1, 2, 3, 99, 5)
num.vec
## [1]  1  2  3 99  5

Можно напрямую назначить NA с помощью подмножества

num.vec[num.vec == 99] <- NA

Однако предпочтительным методом является использование is.na<- как is.na<- ниже. Файл справки ( ?is.na ) гласит:

is.na<- может обеспечить более безопасный способ установки пропусков. Например, для разных факторов это ведет себя иначе.

is.na(num.vec) <- num.vec == 99

Оба метода возвращаются

num.vec
## [1]  1  2  3 NA  5

Удаление отсутствующих значений

Отсутствующие значения могут быть удалены несколькими способами из вектора:

num.vec[!is.na(num.vec)]
num.vec[complete.cases(num.vec)]
na.omit(num.vec)
## [1] 1 2 3 5

Исключение отсутствующих значений из вычислений

При использовании арифметических функций на векторах с отсутствующими значениями будет возвращено отсутствующее значение:

mean(num.vec) # returns: [1] NA

Параметр na.rm сообщает функции исключать значения NA из расчета:

mean(num.vec, na.rm = TRUE) # returns: [1] 2.75

# an alternative to using 'na.rm = TRUE':
mean(num.vec[!is.na(num.vec)]) # returns: [1] 2.75

Некоторые R-функции, такие как lm , имеют параметр na.action . Значение по умолчанию для этого - na.omit , но с options(na.action = 'na.exclude') поведение по умолчанию R может быть изменено.

Если нет необходимости изменять поведение по умолчанию, но для конкретной ситуации na.action другое na.action , параметр na.action должен быть включен в вызов функции, например:

 lm(y2 ~ y1, data = anscombe, na.action = 'na.exclude')


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow