I want to compare two vectors elementwise to check whether an element in a certain position in the first vector is different from the element in the same position in the second vector.
The point is that I have NA
values inside the vectors, and when doing the comparison for these values I get NA
instead of TRUE
or FALSE
.
Reproducible example:
Here is what I get:
a<-c(1, NA, 2, 2, NA)
b<-c(1, 1, 1, NA, NA)
a!=b
[1] FALSE TRUE NA NA NA
Here is how I would like the !=
operator to work (treat NA
values as if they were just another "level" of the variable):
a!=b
[1] FALSE TRUE TRUE TRUE FALSE
There's a possible solution at this link, but the guy is creating a function to perform the task. I was wondering if there's a more elegant way to do that.
Taking advantage of the fact that:
T & NA = NA
but
F & NA = F
and
F | NA = NA
but
T | NA = T
The following solution works, with carefully placed brackets:
(a != b | (is.na(a) & !is.na(b)) | (is.na(b) & !is.na(a))) & !(is.na(a) & is.na(b))
You could define:
`%!=na%` <- function(e1, e2) (e1 != e2 | (is.na(e1) & !is.na(e2)) | (is.na(e2) & !is.na(e1))) & !(is.na(e1) & is.na(e2))
and then use:
a %!=na% b
I like this one, since it is pretty simple and it's easy to see that it works (source):
# This function returns TRUE wherever elements are the same, including NA's,
# and FALSE everywhere else.
compareNA <- function(v1, v2)
{
same <- (v1 == v2) | (is.na(v1) & is.na(v2))
same[is.na(same)] <- FALSE
return(same)
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With