Итак, я был удивлен поведением третьей строки этого кода 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)
Но есть ли общий способ сделать это?