Как R обрабатывает NA в ifelse с 2 векторами? - PullRequest
0 голосов
/ 27 января 2020

Может кто-нибудь помочь мне понять, как R обрабатывает NA в выражениях ifelse?

Допустим, у меня есть следующие векторы:

x <- c(1, 1, 3, NA, 4)
y <- c(1, NA, 1, NA, NA)

Я хочу создать еще один вектор на основе этих двух векторов, и я хочу получить следующий вывод:

z <- c(1, 1, 2, 0, 0)

Я пробовал это:

z <- ifelse(x == 1, 1
            , ifelse(y == 1, 2, 0))

И я пробовал это (что кажется чрезмерным из-за необходимости объяснить все это):

z <- ifelse(x == 1, 1
            , ifelse(!is.na(x)
                     , ifelse(y == 1, 2
                              , ifelse(is.na(y), 0, NA))
                     , 0))

В любом случае это тоже не сработало ... Оба возвращают:

> z
[1]  1  1  2 NA NA

Может кто-нибудь, пожалуйста, помогите мне понять не только как получить желаемый результат, но и как R обрабатывает NA при работе с ifelse, включающим 2 вектора ?

Спасибо.

Ответы [ 2 ]

2 голосов
/ 27 января 2020

В обоих случаях добавьте дополнительную проверку для NA, поскольку все, что сравнивается с NA, возвращает NA.

ifelse(x == 1 & !is.na(x), 1, ifelse(y == 1 & !is.na(y), 2, 0))
#[1] 1 1 2 0 0
0 голосов
/ 27 января 2020

Мы можем сделать его компактным с %in%

ifelse(x %in% 1, 1, ifelse(y %in% 1, 2, 0))
#[1] 1 1 2 0 0
...