[R] Equivalent for Matematica function Which...

Jarek Jasiewicz jarekj at amu.edu.pl
Tue Sep 29 21:17:06 CEST 2009



William Dunlap pisze:
>> -----Original Message-----
>> From: r-help-bounces at r-project.org 
>> [mailto:r-help-bounces at r-project.org] On Behalf Of Jarek Jasiewicz
>> Sent: Tuesday, September 29, 2009 11:36 AM
>> To: Erik Iverson
>> Cc: R-help at r-project.org
>> Subject: Re: [R] Equivalent for Matematica function Which...
>>
>> well function arguments are in square brackets. z is result (new 
>> vector). I show Matematica syntax, but cannot explain what I 
>> expect. Sorry
>> The example is wrong because it can be replaced by R cut 
>> function. The 
>> arguments are: condition,action.... and can be replaced by 
>> ste of ifelse 
>> formulas:
>>
>> if (x<10) x<-0.7
>> else if (x<30 && x=>10) x<-x^2/(x-1)
>> etc...
>> but that solution is slow for vectors with millions of numbers
>>     
>
> ifelse is different than if-then-else.  Your if-then-else needs
> to be in a loop but ifelse is vectorized.  Try something like
>     z <- ifelse(x<10,
>                     0.7,    # result for x's less than 10
>                     ifelse(x<30 & x>=10,   # x>=10 is redundant in this
> branch
>                              x^2/(x-1), # result for x's >=10 and x<30
>                              1))          # result for x's>=30
>
> That evaluates all the arguments for each value in x, even those
> for which the answer will not be used.  That wastes some time
> and sometimes causes warnings or even errors.  In that case you
> can use more flexible but less convenient syntax like:
>
>    z <- NA * x # initialize z to be like x but filled with NA's
>    cond <- x<10
>    z[cond] <- 0.7
>    cond <- x>=10 & x<30
>    z[cond] <- x[cond]^2/(x[cond]-1) # or (function(y)y^2/(y-1))(x[cond])
>    cond <- x>=30
>    z[cond] <- 1.0
>            
>   
Thanks! it seems very good approach
Jarek




More information about the R-help mailing list