R Language
Отсутствующие значения
Поиск…
Вступление
Когда мы не знаем значения, которое принимает переменная, мы говорим, что ее значение отсутствует, обозначенное 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')