>>>>> Hervé Pagès <hpa...@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-boun...@r-project.org] On Behalf Of baccts >> Sent: Wednesday, 29 July 2015 8:26 a.m. >> To: r-help@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. >> >> ______________________________________________ R-help@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.