[R] vectorizing test for equality
    John Miyamoto 
    jmiyamot at u.washington.edu
       
    Fri Dec 20 09:17:03 CET 2002
    
    
  
Dear R Help,
   I am trying to create a boolean vector that is TRUE whenever a
particular value occurs in a numeric vector, and FALSE otherwise.  For
example, suppose that
> y <- c(5, 2, 4, 3, 1)
> y
[1] 5 2 4 3 1
and suppose that I want to find where 3 occurs in y.  Then, the following
yields the solution:
> y == 3
[1] FALSE FALSE FALSE  TRUE FALSE
My problem arises when the numeric vector has missing values.  For
example, suppose that x is the vector
> x <- c( 2, NA, 1, 5, 3)
> x
[1]  2 NA  1  5  3
Now x == 5 yields
> x == 5
[1] FALSE    NA FALSE  TRUE FALSE
whereas what I want is
FALSE  FALSE  FALSE  TRUE  FALSE
I can solve this problem with a for loop:
> flag <- NULL
> for (i in 1:length(x)) flag <- c(flag, identical(x[i], 5))
> flag
[1] FALSE FALSE FALSE  TRUE FALSE
Is there a way to avoid the for loop?  I'm also curious why the following
does not work, because it seems to me it should:
> test <- function(x) identical(x[1], x[2])
> apply(cbind(x, 5), 1, test)
[1] FALSE FALSE FALSE FALSE FALSE
I was expecting to see FALSE FALSE FALSE TRUE FALSE.
John Miyamoto
--------------------------------------------------------------------
John Miyamoto, Dept. of Psychology, Box 351525
University of Washington, Seattle, WA 98195-1525
Phone 206-543-0805, Fax 206-685-3157, Email jmiyamot at u.washington.edu
Homepage http://faculty.washington.edu/jmiyamot/
--------------------------------------------------------------------
    
    
More information about the R-help
mailing list