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/ --------------------------------------------------------------------
> x <- c( 2, NA, 1, 5, 3) > x %in% 5[1] FALSE FALSE FALSE TRUE FALSE Knowledge like this is covered in chapter 2 of MASS4 (Venables & Ripley, 2002). Note that your subject is misleading: == does test for equality, but that is not what you actually wanted. On Fri, 20 Dec 2002, John Miyamoto wrote:> 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/ > -------------------------------------------------------------------- > > ______________________________________________ > R-help at stat.math.ethz.ch mailing list > http://www.stat.math.ethz.ch/mailman/listinfo/r-help >-- Brian D. Ripley, ripley at stats.ox.ac.uk Professor of Applied Statistics, http://www.stats.ox.ac.uk/~ripley/ University of Oxford, Tel: +44 1865 272861 (self) 1 South Parks Road, +44 1865 272860 (secr) Oxford OX1 3TG, UK Fax: +44 1865 272595
Take a look at 'any', which allows to remove missing values before test: any(y==3, na.rm=TRUE) If your vector does not contain integers, dont forget to change 'y==3' test by something more appropriate. (begin to round with a fixed number of dec. for exemple). Eric At 00:15 20/12/2002 -0800, you wrote:>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/ >-------------------------------------------------------------------- > >______________________________________________ >R-help at stat.math.ethz.ch mailing list >http://www.stat.math.ethz.ch/mailman/listinfo/r-help__________________________________________________ Eric Lecoutre Informaticien/Statisticien Institut de Statistique UCL (+32) (0)10 47 30 50 lecoutre at stat.ucl.ac.be http://www.stat.ucl.ac.be/ISpersonnel/lecoutre __________________________________________________ Le vrai danger, ce n'est pas quand les ordinateurs penseront comme des hommes, c'est quand les hommes penseront comme des ordinateurs. Sydney Harris