Элегантная версия% в% в R, которая возвращает NA? - PullRequest
0 голосов
/ 08 июня 2018

Итак, я был удивлен поведением третьей строки этого кода R:

x <- c(1, 2, 3, 4, NA, 5, 6, 7, 8)
ifelse(x < 4, 1, 0)
ifelse(x %in% 1:3, 1, 0)

Возвращает 1,1,1,0,0,0,0,0,0 не то 1,1,1,0,NA,0,0,0,0, которое я предполагал получить, т. Е. Такое же, каквторая строка.Более тщательная проверка файла справки для %in% и match показывает, что это задокументированное поведение, возвращая:

"Логический вектор, указывающий, было ли найдено совпадение для каждого элемента x: таким образом, значенияИСТИНА или ЛОЖЬ и никогда не NA. "

Существует ли общая функция, аналогичная %in%, за исключением того, что она дает NA в этом случае?Например, это возвращает желаемый результат:

`%inna%` <- function(x, table){
  y <- match(x, table, nomatch = 0) > 0
  y[is.na(x)] <- NA
  return(y)
}

ifelse(x %inna% 1:3, 1, 0)

Но есть ли общий способ сделать это?

1 Ответ

0 голосов
/ 08 июня 2018

Мы можем заменить на NA либо умножением NA, сгенерированным с использованием is.na(x)

(x %in% 1:3) * NA^(is.na(x))
#[1]  1  1  1  0 NA  0  0  0  0

, либо использованием replace

replace(+(x %in% 1:3), is.na(x), NA)
#[1]  1  1  1  0 NA  0  0  0  0

Может быть преобразован в функцию

`%inna%` <- function(x, table) {
      replace(as.integer(x %in% table), is.na(x), NA)
 }

x %inna% 1:3
#[1]  1  1  1  0 NA  0  0  0  0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...