Если вы знакомы с SAS, то знаете, что отсутствующие значения считаются -inf, поэтому для такого выражения:

If a < 2 then c=1 ; 

else c= 5; 

Где отсутствует «а»; c будет присвоено значение 1, потому что логическое выражение "a < 2" будет "Истина". Обратите внимание, что мой вопрос касается результата логического выражения. Меня не волнует "с".

Я хотел бы получить то же самое в R, но результатом логического выражения будет «NA»:

<-NA

а < 2

[1] NA

Как я могу изменить вывод этого логического выражения на «Истина»?

Я знаю, что могу это сделать:

output < ifelse( is.na(a), False, a <2)

Но я ищу что-то простое. Любые идеи?

r
0
Afshin Sh 4 Фев 2022 в 16:51
1
NA означает, что значение переменной в этом наблюдении неизвестно (это может быть что угодно). Если значение неизвестно, как можно ожидать, что сравнение будет истинным? Ваша функция ifelse, вероятно, является самым простым способом справиться с этим.
 – 
Bill O'Brien
4 Фев 2022 в 17:01

4 ответа

Просто для удовольствия, и я абсолютно не рекомендую этот подход:

Ops.sas <- function (e1, e2) {
  comparison <- switch(.Generic, `<` = , `>` = , `==` = , `!=` = ,
                    `<=` = , `>=` = TRUE, FALSE)
  if (comparison) {
    e1[is.na(e1)] <- -Inf
    e2[is.na(e2)] <- -Inf
  }
  
  NextMethod(.Generic)
}

И сейчас:

> foo <- structure(c(NA, 2,3,2, NA), class = "sas")
> bar <- structure(c(2,3,2, NA, NA), class = "sas")
> foo < bar
[1]  TRUE  TRUE FALSE FALSE FALSE
> foo <= bar
[1]  TRUE  TRUE FALSE FALSE  TRUE
> foo == bar
[1] FALSE FALSE FALSE FALSE  TRUE
> foo != bar
[1]  TRUE  TRUE  TRUE  TRUE FALSE
> foo > bar
[1] FALSE FALSE  TRUE  TRUE FALSE
> foo >= bar
[1] FALSE FALSE  TRUE  TRUE  TRUE
1
dash2 4 Фев 2022 в 17:46
if(is.na(a) | a < 2){
   c=1
} else {
   c=2
}

Я думаю, что самый простой способ — просто добавить новое условие в свой тест. В R символ | означает ИЛИ.

0
Wawv 4 Фев 2022 в 17:29

Вы можете использовать тот факт, что NA является логическим объектом.

(a < 2) | is.na(a)

0
slowowl 4 Фев 2022 в 17:42
Я люблю это. Это то, что я ищу.
 – 
Afshin Sh
4 Фев 2022 в 17:48
Подробнее см. здесь.
 – 
slowowl
4 Фев 2022 в 17:58

Я думаю, вам придется изменить значения в a, например, так

a <- c(NA, 1, 3, 4, NA)
a
#> [1] NA  1  3  4 NA

a < 2
#> [1]    NA  TRUE FALSE FALSE    NA

a[is.na(a)] <- -Inf

a < 2
#> [1]  TRUE  TRUE FALSE FALSE  TRUE

Создано 4 февраля 2022 г. с помощью пакета reprex (v2.0.1)

-1
Seb 4 Фев 2022 в 17:05