R: Работа с TRUE, FALSE, NA и NaN
Вот вектор
a = c(T,F,F,NA,F,T,NA,F,T)
Мне нужна простая функция, которая возвращает TRUE каждый раз, когда есть TRUE в a
и False каждый раз, когда есть False или NA в a
.
3 следующие вещи не работают
a == T
identical(T,a)
isTRUE(a)
Вот решение
a[-which(is.na(a))]
но это не похоже на прямое и простое решение
Есть ли другое решение?
Вот некоторые функции (и операторы), которые я знаю:
identical()
isTRUE()
is.na()
na.rm()
&
|
!
Каковы другие функции (операторы, подсказки, что угодно,...), которые полезны для работы с TRUE, FALSE, NA, NaN?
и, наконец,...
Каковы различия между NA и NaN?
Существуют ли другие "логические вещи", чем T, F, NA и NaN?
Спасибо большое!
Ответы
Ответ 1
Чтобы ответить на ваши вопросы в порядке:
1) Оператор ==
действительно не обрабатывает NA так, как вы ожидали. Очень полезной функцией является функция compareNA
из r-cookbook.com:
compareNA <- function(v1,v2) {
# This function returns TRUE wherever elements are the same, including NA's,
# and false everywhere else.
same <- (v1 == v2) | (is.na(v1) & is.na(v2))
same[is.na(same)] <- FALSE
return(same)
}
2) NA означает "Недоступно" и не совпадает с общим NaN ( "не числом" ). NA обычно используется для значения по умолчанию для числа, которое будет стоять за отсутствующие данные; NaN обычно генерируются из-за числовой проблемы (с учетом журнала -1 или аналогичного).
3) Я не совсем уверен, что вы подразумеваете под "логическими вещами" - множество разных типов данных, включая числовые векторы, могут использоваться в качестве входных данных для логических операторов. Вы можете попробовать прочитать страницу логических операторов R: http://stat.ethz.ch/R-manual/R-patched/library/base/html/Logic.html.
Надеюсь, это поможет!
Ответ 2
Вам не нужно ничего обертывать в функции - следующие работы
a = c(T,F,NA)
a %in% TRUE
[1] TRUE FALSE FALSE
Ответ 3
Итак, вы хотите, чтобы TRUE оставался TRUE и FALSE, чтобы оставаться FALSE, единственное реальное изменение заключается в том, что NA должно стать FALSE, поэтому просто выполните это изменение, например:
a[ is.na(a) ] <- FALSE
Или вы можете перефразировать, чтобы сказать, что это только ИСТИНА, если оно ИСТИНА и не пропущено:
a <- a & !is.na(a)
Ответ 4
Взяв предложение Бена Болкера выше, вы можете установить свою собственную функцию, следуя синтаксису is.na()
is.true <- function(x) {
!is.na(x) & x
}
a = c(T,F,F,NA,F,T,NA,F,T)
is.true(a)
[1] TRUE FALSE FALSE FALSE FALSE TRUE FALSE FALSE TRUE
Это также работает для подмножества данных.
b = c(1:9)
df <- as.data.frame(cbind(a,b))
df[is.true(df$a),]
a b
1 1 1
6 1 6
9 1 9
И помогает избежать случайного включения пустых строк, где NA существует в данных.
df[df$a == TRUE,]
a b
1 1 1
NA NA NA
6 1 6
NA.1 NA NA
9 1 9
Ответ 5
Мне нравится функция is.element:
is.element(a, T)