[R] Multiple if function

Bert Gunter bgunter.4567 at gmail.com
Wed Sep 16 16:41:31 CEST 2015


Yes! Chuck's use of mapply is exactly the split/combine strategy I was
looking for. In retrospect, exactly how one should think about it.
Many thanks to all for a constructive discussion .

-- Bert


Bert Gunter

"Data is not information. Information is not knowledge. And knowledge
is certainly not wisdom."
   -- Clifford Stoll


On Wed, Sep 16, 2015 at 12:40 AM, peter dalgaard <pdalgd at gmail.com> wrote:
> 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
>
> ______________________________________________
> 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.



More information about the R-help mailing list