Подтвердить что ты не робот

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?

Спасибо большое!

4b9b3361

Ответ 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)