On 13-Aug-09 19:21:36, David Huffer wrote: > When adding several logical vectors I expect each vector will be > coerced to integers and these vectors will then be added. > > That doesn't always seem to be the case. > > For example: > > > ( f1 <- as.factor ( sample ( "x" , 25 , rep = T ) ) ) > [1] x x x x x x x x x x x x x x x x x x x x x x x x x > Levels: x > > ( f2 <- as.factor ( sample ( "y" , 25 , rep = T ) ) ) > [1] y y y y y y y y y y y y y y y y y y y y y y y y y > Levels: y > > ( f3 <- as.factor ( sample ( "z" , 25 , rep = T ) ) ) > [1] z z z z z z z z z z z z z z z z z z z z z z z z z > Levels: z > > > > is.na ( f1 [ sample ( 1:25 , 4 ) ] ) <- > + is.na ( f2 [ sample ( 1:25 , 4 ) ] ) <- > + is.na ( f3 [ sample ( 1:25 , 4 ) ] ) <- TRUE > > > > ## this returns a numeric vector: > > > > is.na ( f1 ) + is.na ( f2 ) + is.na ( f3 ) > [1] 0 0 0 0 0 1 1 0 0 0 1 0 0 1 0 0 1 0 1 2 2 0 1 0 1 > > > > ## but this returns a logical vector > > > > !is.na ( f1 ) + !is.na ( f2 ) + !is.na ( f3 ) > [1] TRUE TRUE TRUE TRUE TRUE TRUE FALSE TRUE > [9] TRUE TRUE TRUE TRUE TRUE FALSE TRUE TRUE > [17] FALSE TRUE FALSE TRUE FALSE TRUE FALSE TRUE > [25] FALSE > > > > Can someone please explain why the returned value is a logical > vector when I use the not operator but a numeric vector when I > don't. > > What is special about the !is.na? it returns an object of class > logical just like the is.na function: > > > all.equal ( class ( !is.na ( f1 ) ) , class ( is.na ( f1 ) ) ) > [1] TRUE > > > > Thanks!
I think you need to compare: [1] is.na ( f1 ) + !is.na ( f2 ) # [1] 2 0 1 1 2 1 0 1 1 #[10] 1 0 2 1 1 0 1 1 2 #[19] 1 1 1 1 1 1 1 with [2] !is.na ( f1 ) + !is.na ( f2 ) # [1] FALSE TRUE FALSE FALSE FALSE FALSE TRUE FALSE FALSE #[10] FALSE TRUE FALSE FALSE FALSE TRUE FALSE FALSE FALSE #[19] FALSE FALSE FALSE FALSE FALSE FALSE FALSE and with [3] (!is.na ( f1 )) + (!is.na ( f2 )) # [1] 1 1 2 2 1 2 1 2 2 2 1 1 2 2 1 2 2 1 2 2 2 2 2 2 2 In other words, I think you have been trapped by Precedence: see '?Syntax'. What seems to happen is that is.na ( f1 ) + !is.na ( f2 ) evalutes is.na(f1) as a logical vector, !is.na(f2) as a logical vector, and adds them getting a numerical result. See [1]. On the other hand, apparently !is.na ( f1 ) + !is.na ( f2 ) negates the result of [1] (compare the outputs of [1] and [2]) and hence produces a logical vector (because of the first "!"). In other words, the first "!" is applied to the result of is.na ( f1 ) + !is.na ( f2 ). In the form given in [3], the parentheses ensure that the logical negations "!" are applied before the "+" is applied, so two logical vectors are added, with a numerical result. (I hope I've got this right)! Ted. -------------------------------------------------------------------- E-Mail: (Ted Harding) <ted.hard...@manchester.ac.uk> Fax-to-email: +44 (0)870 094 0861 Date: 13-Aug-09 Time: 20:50:51 ------------------------------ XFMail ------------------------------ ______________________________________________ R-help@r-project.org mailing list 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.