[R] indices of mismatch element in two vector with missing values

Martin Maechler maechler at stat.math.ethz.ch
Wed Jul 29 11:03:03 CEST 2015


>>>>> Hervé Pagès <hpages at fredhutch.org>
>>>>>     on Tue, 28 Jul 2015 23:07:14 -0700 writes:

    > On 07/28/2015 09:58 PM, Peter Alspach wrote:
    >> One way ....
    >> 
    >> seq(test1)[-which(test1==test2)]

    > One question is whether 2 NAs should be considered to match or not.
    > The OP doesn't tell but I guess he wants them to match:

    > test1 <- c("1", "2",  NA, "4", NA, "6")
    > test2 <- c("1", "2", "3",  NA, NA, "66")

    > seq(test1)[-which(test1==test2)]
    > # [1] 3 4 5 6

    > 5 should probably not be there!

    >> but I imagine there are better ones .....
    >> 

Yes, indeed, as logical indexing is
considerably safer than "negative indexing with which(.)" :

PLEASE, everyone, do remember:

 %%>===================================================================<%%
 %%>  There is one ___big__ disadvantage to  [ - which(<logical>) ] :  <%%
 %%>  It entirely __fails__ when the logical vector is all FALSE       <%%
 %%>===================================================================<%%


  ## Example (remember, we want the indices of *differing* entries):
  ## ------- Here, all entries differ, so we want to get  1:8 :

   x <- c(NA, 1:7)
   y <- c(11:17, NA)

   ## now this
   seq(x)[ - which(x == y) ]  ## gives not what you expect

   ## But logical indexing always works:
	    x == y & is.na(x) == is.na(y)
   seq(x)[!(x == y & is.na(x) == is.na(y))]

With output :

> x <- c(NA, 1:7)
> y <- c(11:17, NA)
> ## now this
> seq(x)[ - which(x == y) ]  ## gives not what you expect
integer(0)

> ## But logical indexing always works:
>          x == y & is.na(x) == is.na(y)
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
> seq(x)[!(x == y & is.na(x) == is.na(y))]
[1] 1 2 3 4 5 6 7 8
> 

Martin Maechler
ETH Zurich


    >> -----Original Message-----
    >> From: R-help [mailto:r-help-bounces at r-project.org] On Behalf Of baccts
    >> Sent: Wednesday, 29 July 2015 8:26 a.m.
    >> To: r-help at r-project.org
    >> Subject: [R] indices of mismatch element in two vector with missing values
    >> 
    >> How would you return the index where two vectors differs if they may contain missing (NA) values?
    >> For example:
    >> test1 <- c("1","2",NA);
    >> test2 <- c("1","2","3");
    >> which(test1!=test2) does not return 3!
    >> 
    >> Thanks in advance.
    >> 
    >>



More information about the R-help mailing list