[R] different functions on different vector subsets

Thomas Lumley tlumley at u.washington.edu
Thu Nov 10 18:04:49 CET 2005


On Thu, 10 Nov 2005, Ron Ophir wrote:

> Hi,
> I am trying to apply two different functions on on a vector as follow:
> a<-c(NA,1,2,3,-3,-4,-6)
> if a>0 I would like to raise it by the power of 2: 2^a and if the a<0 I
> would like to have the inverse value, i.e., -1/2^a.
> so I thought of doing it two steps:
> a[a>0]<-2^[a>0]
> a[a<0]<-(-1)/2^a[a<0]
> I got the following error
> Error: NAs are not allowed in subscripted assignments
> any other ma>nupulation that I did with is.na() but did not succeed.
> What is funny that the two sides of the assignment work and return the
> same vector size:
>> 2^a[a>0]
> [1] NA  2  4  8
>> a[a>0]
> [1] NA  1  2  3

The reason NAs are not allowed in subscripted assignments is based on 
numeric rather than logical subscripts.

For numeric subscripts the problem is ambiguity about what the NA index 
should do (we know there is ambiguity because two parts of the R code did 
different things).  For logical subscripts you could argue that the 
ambiguity isn't present and that if the index was NA the element should 
just be set to NA. This change might be worth making.


> I found a solution in term of:
> sapply(a,function(x) if (is(s.na)) NA else if (x<0) (-1)/2^x else 2^x)
> but still I would like to understand why the solution above did not
> work. I think is more ellegant.

A better general solution is

  a<-ifelse(a<0, -1/2^a, 2^a)

An alternative for this problem that is faster when a is very large is
  a<-sign(a)*2^abs(a)

 	-thomas




More information about the R-help mailing list