# [R] ifelse and "&&" vs "&

Gustaf Rydevik gustaf.rydevik at gmail.com
Wed Jun 18 15:47:02 CEST 2008

```On Wed, Jun 18, 2008 at 3:10 PM, Christos Argyropoulos
<argchris at hotmail.com> wrote:
>
> Hi,
>
> I noticed whether some one could explain why "&" and "&&" behave differently in data frame transformations.
>
> Consider the following :
>
> a<-data.frame(r=c(0,0,2,3),g=c(0,2,0,2.1))
>
> Then:
>
>> transform(a,R=ifelse(r>0 && g> 0,log(r/g),NA))
>
>  r   g  R
> 1 0 0.0 NA
> 2 0 2.0 NA
> 3 2 0.0 NA
> 4 3 2.1 NA
>
> but
>
>> transform(a,R=ifelse(r>0 & g> 0,log(r/g),NA))
>  r   g         R
> 1 0 0.0        NA
> 2 0 2.0        NA
> 3 2 0.0        NA
> 4 3 2.1 0.3566749
>
>
> If my understanding of the differences between "&" and "&&" and how 'transform' works are accurate, both statements should produce the same output.
>
>
> I got the same behaviour in Windows XP Pro 32-bit (running R v 2.7) and Ubuntu Hardy (running the same version of R).
>
>
> Thanks
>
> Christos Argyropoulos
>
> University of Pittsburgh Medical Center
> _________________________________________________________________

from ?"&" : " The shorter form performs elementwise comparisons in
much the same way as arithmetic operators. The longer form evaluates
left to right examining only the first element of each vector. "

Thus,

> a\$r & a\$g
[1] FALSE FALSE FALSE  TRUE
> a\$r && a\$g
[1] FALSE

ifelse takes a vector as argument. isince && only gives a single
value,  ifelse(r>0 && g> 0,log(r/g),NA) will only return NA, which
then is recycled by transform. When using &, ifelse returns a vector,
and this vector is appended to the data frame.

/Gustaf

--
Gustaf Rydevik, M.Sci.
tel: +46(0)703 051 451
skype:gustaf_rydevik

```