Я пытаюсь сравнить два вектора для идентичных элементов, скажем, для векторов a и b ниже.
# vectors a and b
a <- c(1, 2, 3, NA)
b <- c(1, 3, NA, NA)
# compare for identity
a == b
## [1] TRUE FALSE NA NA
Однако я бы хотел, чтобы сравнение включало NA, чтобы, когда оба элемента в данной позиции имеют значение NA, результат будет TRUE, но если только один из них равен NA, то это будет FALSE. Для этого я написал функцию ниже.
# function to include NA's in the comparison
compare_incl_NA <- function(vec1, vec2){
res = ifelse(is.na(vec1) | is.na(vec2),
is.na(vec1) & is.na(vec2),
vec1 == vec2)
res
}
# run function
compare_incl_NA(a,b)
## [1] TRUE FALSE FALSE TRUE
Он выдает желаемый результат и отлично работает для моих целей, но мне любопытно узнать, есть ли какая-то встроенная функция для этого или, если нет, является ли написанная мной функция наиболее эффективным способом получения этого результата.





Вы можете использовать identical вместе с mapply. Например
mapply(identical, a, b)
# [1] TRUE FALSE FALSE TRUE
identical, безусловно, стоило прочитать, поскольку я вижу, что в значительной степени злоупотребляю == и т. д.
Это потрясающе. Я некоторое время возился с identical и понял, что мне определенно нужно немного лучше познакомиться с глаголами применения. Недавно они решили несколько проблем.
Функция базового набора setequal может сравнивать два вектора и считать NA эквивалентным:
setequal(a,b)
setequal вернет только одно общее значение ИСТИНА/ЛОЖЬ при сравнении всего вектора. Он не будет возвращать значение TRUE/FALSE для каждого сравниваемого элемента. То есть с помощью этой функции вы не можете определить, какие позиции отличаются.
Хотя если применить с mapply, как указано выше, setequal даст тот же результат. то есть mapply(setequal, a, b). Есть ли причина, по которой в этом контексте можно предпочесть identicalsetequal?
identical довольно строгий и включает класс объекта. Следовательно, setequal(as.numeric(NA),as.character(NA)) будет TRUE, тогда как identical(as.numeric(NA),as.character(NA)) будет FALSE
Важно отметить, что
NAиNULL— это разные понятия в R. Числовой вектор не может содержатьNULL, но может содержатьNA.