Я пытаюсь сравнить два вектора для идентичных элементов, скажем, для векторов 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)
. Есть ли причина, по которой в этом контексте можно предпочесть identical
setequal
?
identical
довольно строгий и включает класс объекта. Следовательно, setequal(as.numeric(NA),as.character(NA))
будет TRUE
, тогда как identical(as.numeric(NA),as.character(NA))
будет FALSE
Важно отметить, что
NA
иNULL
— это разные понятия в R. Числовой вектор не может содержатьNULL
, но может содержатьNA
.