[R] Multiple if function

peter dalgaard pdalgd at gmail.com
Wed Sep 16 09:40:59 CEST 2015


I think a more common idiom for the simpler case would be to use indexing

vals <- c(0.1, 0.15, 0.2) 
mult <- vals[ASBclass]

(However, some people are on the move to enforce 

mult <- vals[as.numeric(ASBclass)]

because people who confuse factors and character variables get even more confused about factor indexing being different from character indexing.)

For the more complex cases, I think Chuck's split/unsplit principle is the ticket. For one thing, you avoid silliness like (X >= 0) * sqrt(X) + (X < 0) * -sqrt(-X) coming out with warnings from calculating the non-selected alternative.

-pd

> On 16 Sep 2015, at 07:56 , Anthoni, Peter (IMK) <peter.anthoni at kit.edu> wrote:
> 
> Hi,
> 
> I guess this might work too and might be quite speedy:
> 
> ASBclass = factor(c(1,2,2,3,2,1))
> Flow = c(1,1,1,1,1,1)
> 
> mult = ((ASBclass==1) * 0.1 + (ASBclass==2) * 0.15 + (ASBclass==3) * 0.2)
> deviation = mult * Flow
> 
> or with the more complex arithmetic:
> 
> deviation = ((ASBclass==1) * (Flow*2) + (ASBclass==2) * (Flow+3) + (ASBclass==3) * sqrt(Flow))
> 
> cheers
> Peter
> 
> 
> 
>> On 16 Sep 2015, at 04:20, Charles C. Berry <ccberry at ucsd.edu> wrote:
>> 
>> On Tue, 15 Sep 2015, Bert Gunter wrote:
>> 
>>> Thanks to both Davids.
>>> 
>>> I realize that these things are often a matter of aesthetics -- and
>>> hence have little rational justification -- but I agree with The Other
>>> David: eval(parse) seems to me to violate R's soul( it makes R a macro
>>> language instead of a functional one).
>>> 
>>> However, mapply(... switch) effectively loops through the frame row by
>>> row. Aesthetically, I like it; but it seems inefficient. If there are
>>> e.g. 1e6 rows in say 10 categories, I think Jeff's approach should do
>>> much better.  I'll try to generate some actual data to see unless
>>> someone else beats me to it.
>> 
>> Use mapply like this on large problems:
>> 
>> unsplit(
>>   mapply(
>>       function(x,z) eval( x, list( y=z )),
>>       expression( A=y*2, B=y+3, C=sqrt(y) ),
>>       split( dat$Flow, dat$ASB ),
>>       SIMPLIFY=FALSE),
>>   dat$ASB)
>> 
>> Chuck
>> 
>> ______________________________________________
>> R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see
>> 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.
> 
> ______________________________________________
> R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see
> 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.

-- 
Peter Dalgaard, Professor,
Center for Statistics, Copenhagen Business School
Solbjerg Plads 3, 2000 Frederiksberg, Denmark
Phone: (+45)38153501
Email: pd.mes at cbs.dk  Priv: PDalgd at gmail.com



More information about the R-help mailing list