[R] NA treatment when comparing two vectors

Marc Schwartz marc_schwartz at me.com
Tue Oct 4 21:17:50 CEST 2016


Bill,

I had initially thought of using all.equal() along with isTrue(), however Fabien's desire for a pairwise element based approach, along with the specific NA handling steered me away from it and towards code along the lines of what Bert had offered, which builds on the basic notion of approximate numeric equality as used in all.equal().

Regards,

Marc


> On Oct 4, 2016, at 2:02 PM, William Dunlap via R-help <r-help at r-project.org> wrote:
> 
> The all.equal function returns TRUE if two objects are pretty similar to
> one another and a textual description of the differences if not.  Use
> isTRUE on its output if you just want a TRUE/FALSE answer.
> 
>> all.equal(c(1,2*(1+.Machine$double.eps),NaN), c(1,2,NaN))
>  [1] TRUE
>> all.equal(c(1,2*(1+.Machine$double.eps),NaN), c(1,2,NaN), tolerance=0)
>  [1] "Mean relative difference: 2.220446e-16"
>> isTRUE(all.equal(c(1,2*(1+.Machine$double.eps),NaN), c(1,2,NaN),
> tolerance=0))
>  [1] FALSE
>> all.equal(c(a=1, b=2), c(x=1, b=2))
>  [1] "Names: 1 string mismatch"
> 
> 
> 
> Bill Dunlap
> TIBCO Software
> wdunlap tibco.com
> 
> 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.
>> 
> 
> 	[[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