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 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. my R version is:> sessionInfo()R version 2.2.0, 2005-10-06, i386-pc-mingw32 attached base packages: [1] "methods" "stats" "graphics" "grDevices" "utils" "datasets" [7] "base" Thanks, Ron [[alternative HTML version deleted]]
The error messages mean what they say.> 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.## I assume you mean 1/(2^a). If not, modify the following appropriately. 2^(a*sign(a)) ## will do As for your error message for:> a[a<0]<-(-1)/2^a[a<0]a<0 has an NA at the first index and so R doesn't know what index you want to assign the value to. Ergo the error message. -- Bert Gunter Genentech Non-Clinical Statistics South San Francisco, CA "The business of the statistician is to catalyze the scientific learning process." - George E. P. Box> -----Original Message----- > From: r-help-bounces at stat.math.ethz.ch > [mailto:r-help-bounces at stat.math.ethz.ch] On Behalf Of Ron Ophir > Sent: Thursday, November 10, 2005 7:26 AM > To: r-help at stat.math.ethz.ch > Subject: [R] different functions on different vector subsets > > 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 > > 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. > my R version is: > > sessionInfo() > R version 2.2.0, 2005-10-06, i386-pc-mingw32 > > attached base packages: > [1] "methods" "stats" "graphics" "grDevices" "utils" > "datasets" > [7] "base" > Thanks, > Ron > > > [[alternative HTML version deleted]] > > ______________________________________________ > R-help at stat.math.ethz.ch mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide! > http://www.R-project.org/posting-guide.html >
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 3The 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
Oops. Sorry. Should be: sign(a)*2^a where I assume you meant the inverse value should be -1/2^|a| = - 2^a for a<0 -- Bert Gunter Genentech Non-Clinical Statistics South San Francisco, CA "The business of the statistician is to catalyze the scientific learning process." - George E. P. Box> -----Original Message----- > From: bgunter > Sent: Thursday, November 10, 2005 9:00 AM > To: Ron Ophir; r-help at stat.math.ethz.ch > Subject: RE: [R] different functions on different vector subsets > > The error messages mean what they say. > > > 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. > ## I assume you mean 1/(2^a). If not, modify the following > appropriately. > > 2^(a*sign(a)) ## will do > > As for your error message for: > > a[a<0]<-(-1)/2^a[a<0] > > a<0 has an NA at the first index and so R doesn't know what > index you want to assign the value to. Ergo the error message. > > -- Bert Gunter > Genentech Non-Clinical Statistics > South San Francisco, CA > > "The business of the statistician is to catalyze the > scientific learning process." - George E. P. Box > > > > > -----Original Message----- > > From: r-help-bounces at stat.math.ethz.ch > > [mailto:r-help-bounces at stat.math.ethz.ch] On Behalf Of Ron Ophir > > Sent: Thursday, November 10, 2005 7:26 AM > > To: r-help at stat.math.ethz.ch > > Subject: [R] different functions on different vector subsets > > > > 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 > > > > 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. > > my R version is: > > > sessionInfo() > > R version 2.2.0, 2005-10-06, i386-pc-mingw32 > > > > attached base packages: > > [1] "methods" "stats" "graphics" "grDevices" "utils" > > "datasets" > > [7] "base" > > Thanks, > > Ron > > > > > > [[alternative HTML version deleted]] > > > > ______________________________________________ > > R-help at stat.math.ethz.ch mailing list > > https://stat.ethz.ch/mailman/listinfo/r-help > > PLEASE do read the posting guide! > > http://www.R-project.org/posting-guide.html > > >
Prof Brian Ripley
2005-Nov-10 17:32 UTC
[R] different functions on different vector subsets
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 > > 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.What do you think the NA value in> a > 0[1] NA TRUE TRUE TRUE FALSE FALSE FALSE means? Should you replace a[1] or not? You are saying you don't know, so what is R to do? It tells you to make up your mind. Try ind <- !is.na(a) & a > 0 a[ind] <- 2^a[ind] ind <- !is.na(a) & a < 0 a[ind] <- (-1)/2^a[ind] or use ifelse as in ifelse(a > 0, 2^a, -1/2^a) which is a lot more elegant. -- 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 272866 (PA) Oxford OX1 3TG, UK Fax: +44 1865 272595
Thanks Thomas, "...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 see you got my point. NA should return NA no matter what the comparison is. But any way thanks Brian, Jim, and Berton, I have leaned a lot. It was a good practice. Ron Ron Ophir, Ph.D. Bioinformatician, Biological Services Weizmann Institute of Science POB 26 Rehovot 76100 Israel e-mail: Ron.Ophir at weizmann.ac.il Phone: 972-8-9342614 Fax:972-8-9344113>>> Thomas Lumley <tlumley at u.washington.edu> 11/10/05 7:04 PM >>>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<0I> 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 3The 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
On Thu, 10 Nov 2005, Ron Ophir wrote:> Thanks Thomas, > > "...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 see you got my point. NA should return NA no matter what the > comparison is.I'm not sure that I did get your point. As Brian said, you aren't specifying whether or not to set the value. In your example it didn't matter because it would end up NA either way. I was saying that for eg a<-c(1,2,3,4) b<-c(NA,T,F,T) a[b]<-7 we could relax the prohibition on NA indexing to give c(NA,7,7,7) as the result. In your case that would give what you wanted, but in other cases it might not. -thomas
I thought about other cases but I have to dissagree with you. For logical vector NA is no decision and that should be the results of it. Let's say that -b- is a result of comparison not of -a- to something rather a compsrison of -c- to -d-. In this case NA in the first position is a result of NA in either -c- or -d- or both. Now, if the result I wanted to get from your example a<-c(1,2,3,4) b<-c(NA,T,F,T) a[b]<-7 is c(1,7,7,7) I should replace the NA (no decision) with F and if to get c(7,7,7,7) the NA should be replaced by T otherwise the result should be c(NA,7,7,7). The first two option are possible to perform in R the third is not and that is to the user to decide which to choose. Ron>>> Thomas Lumley <tlumley at u.washington.edu> 11/10/05 11:02 PM >>>On Thu, 10 Nov 2005, Ron Ophir wrote:> Thanks Thomas, > > "...For logical subscripts you could argue that the > ambiguity isn't present and that if the index was NA the elementshould> just be set to NA. This change might be worth making." > > I see you got my point. NA should return NA no matter what the > comparison is.I'm not sure that I did get your point. As Brian said, you aren't specifying whether or not to set the value. In your example it didn't matter because it would end up NA either way. I was saying that for eg a<-c(1,2,3,4) b<-c(NA,T,F,T) a[b]<-7 we could relax the prohibition on NA indexing to give c(NA,7,7,7) as the result. In your case that would give what you wanted, but in other cases it might not. -thomas