[R] NA treatment when comparing two vectors

Bert Gunter bgunter.4567 at gmail.com
Tue Oct 4 19:33:47 CEST 2016


Fabien:

In general, R's philosophy as a programming language is that it should
make it easy (and maybe efficient) to do the (data analysis) things
you want to do, not necessarily provide all pre-packaged procedures
(although with all the packages, it seems to come close to that!). So
the following seems to fall into that paradigm (using your example a
and b)

> tol <- 1e-15

> xor(is.na(a),is.na(b)) | (abs(b-a) > tol)
[1] FALSE  TRUE  TRUE  TRUE    NA


As you noted, defining equality of floating point numbers is a tricky
business, so that you may prefer some other approach to that which I
used. There may well be "pre-packaged" ways to do this, but I didn't
look. You might try searching rseek.org for "defining numerical
equality in R" or some such to see.


Cheers,
Bert
Bert Gunter

"The trouble with having an open mind is that people keep coming along
and sticking things into it."
-- Opus (aka Berkeley Breathed in his "Bloom County" comic strip )


On Tue, Oct 4, 2016 at 9:51 AM, fabien verger <fabien.verger at gmail.com> wrote:
> Hello,
>
> I want to get the differences when comparing 2 vectors, by pair (element by
> element).
> I'd like to get TRUEs when:
> - the two compared elements are different and non-missing (like `!=` does)
> - one element is missing and the other is not missing (unfortunatelly `!=`
> gives NA and not TRUE)
> Note that I don't want to get TRUEs when both are missing. NA or FALSE are
> fine.
>
> Given a and b:
>> a <- c(1, 2, 3,  NA, NA)
>> b <- c(1, 9, NA, 4 , NA)
>
> The only solution I found is:
>
>> a != b | (is.na(a) != is.na(b))
> [1] FALSE  TRUE  TRUE  TRUE    NA
>
> Is there a single function which can do the same?
> I searched for other comparison tools but found nothing relevant.
>
> And I would like also to avoid using `!=` because I'm often comparing
> floating numbers computed by different algorithms (so rounded differently).
>
> I found identical() interesting (for exemple, !(identical(NA, 99)) gives
> TRUE) but the result of !(identical(a, b) is a single logical, not a vector
> of logicals.
>
> Many thanks in advance for your help.
> P.S. I am new to R, coming from SAS. Actually, I'm looking for the R
> function that replicates the SAS instruction: if a ^= b;
>
>         [[alternative HTML version deleted]]
>
> ______________________________________________
> R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.



More information about the R-help mailing list