Существуют ли разные типы НС?
Я использую пакет rattle, чтобы выполнить некоторую очистку данных, и я рассматриваю первую переменную X в моем наборе данных. Он сообщает, что когда я делаю на первой вкладке, вкладке "Данные", я получаю некоторые базовые данные из набора данных и говорит, что переменная X имеет 1243 пропущенных значения. Это также значение, которое я получу, если использую sum(is.na(my_df[,1]))
,
На следующей вкладке, вкладке "Исследовать", когда я проверяю "Сводка", теперь говорится, что у меня всего 942 NA в переменной X.
Как я могу понять эти разные цифры? Я вручную немного просмотрел свой набор данных и просмотрел ряды, в которых были NA, и все эти NA выглядят одинаково (я понимаю, что иногда существуют разные типы NA).
(Дополнительный вопрос: sum(is.na(my_df[,1]), na.rm = FALSE)
а также sum(is.na(my_df[,1]),na.rm = TRUE)
также оба производят одинаковое число 1243, почему? Я бы ожидал, что один дает мне length(my_df[,1])-1243
.)
РЕДАКТИРОВАТЬ Вот набор данных, который имеет эту проблему: https://wetransfer.com/downloads/cf454b2c12857a4e3770102a7222422f20171019153755/516fb0.
Числа в этом немного отличаются, вместо 1243, у нас есть 88 NA согласно вкладке "Данные" в rattle() (или, что эквивалентно, согласно summary(ten_df)
) и 62 NA в соответствии с "Исследовать" с проверенной вкладкой "Сводка".
Но теперь я подозреваю, что мой набор данных поврежден, потому что перед загрузкой полного набора я хотел первоначально загрузить только один иллюстративный столбец. Но когда я выполню
ten_df = read.csv("ten.csv",sep=";")
my_df = as.data.frame(ten_df[,3])
так как я хочу посмотреть на третий столбец с var2
а также my_df
было то, что я хотел загрузить изначально, последняя команда возвращает ошибку
Warning messages:
1: In rep(no, length.out = length(ans)) :
'x' is NULL so the result will be NULL
Кроме того, при выборе my_df для последующего анализа с помощью трещотки трещотка говорит "0 входная переменная" на панели внизу, где она дает обратную связь. Как это может быть?
1 ответ
?NA
NA - логическая константа длины 1, которая содержит индикатор отсутствующего значения. NA может быть приведен к любому другому векторному типу, кроме raw. Существуют также константы NA_integer_, NA_real_, NA_complex_ и NA_character_ других типов атомарных векторов, которые поддерживают пропущенные значения: все они являются зарезервированными словами в языке R.
class(NA) # "logical"
class(NA_integer_) # "integer"
class(NA_real_) # "numeric"
class(NA_complex_) # "complex"
class(NA_character_) # "character"
is.na(NA) # TRUE
is.na(NA_integer_) # TRUE
is.na(NA_real_) # TRUE
is.na(NA_complex_) # TRUE
is.na(NA_character_) # TRUE
identical(NA,NA_integer_) # FALSE
identical(NA,NA_real_) # FALSE
identical(NA,NA_complex_) # FALSE
identical(NA,NA_character_) # FALSE
identical(NA_character_,as.character(NA)) # TRUE
identical(NA_real_,as.numeric(NA)) # TRUE
identical(as.logical(NA_real_),NA) # TRUE
Так что NA это logical
, Так почему же мы используем NA практически везде, не беспокоясь о классе? из-за правил принуждения:
class(c(NA,1)[1]) # "numeric"
identical(c(NA,1),c(NA_real_,1)) # TRUE
c(NA_character_,1) # [1] NA "1"
В зависимости от class
, NA
также может быть напечатан по-другому
Теперь вернемся к вашему вопросу, я не могу ответить на первый, потому что вы не предлагаете воспроизводимых данных, но почему sum(is.na(my_df[,1]), na.rm = FALSE)
а также sum(is.na(my_df[,1]),na.rm = TRUE)
, это потому что is.na(my_df[,1])
только из TRUE
а также FALSE
не NA
s.
Вы также можете попробовать length(na.omit(my_df[,1]))
,
РЕДАКТИРОВАТЬ:
Данный столбец data.frame
имеет только элементы одного класса, поэтому у вас не будет разных NA_character_
а также NA_real_
в том же столбце.
Однако часто случается так, что у вас будут строки, значение которых "NA"
не стоит, конечно, ожидать is.na
обнаружить те. В этих случаях вы можете использовать df[df == "NA"] <- NA
иметь регулярный NA
с вместо "NA"
строки в вашем data.frame