[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