[R] need help in if else condition

peter dalgaard pd@|gd @end|ng |rom gm@||@com
Sun Jul 14 21:59:58 CEST 2019


Er, what version is this? I have (on a late 2010 MB Air!)

> system.time(ifelse(x < y, x, y))
   user  system elapsed 
  0.072   0.012   0.085 

and even

> system.time({r<-numeric(1000000);ix <- x < y; r[ix]<-x[ix]; r[!ix]<-y[!ix]; r})
   user  system elapsed 
  0.082   0.053   0.135 

-pd


> On 12 Jul 2019, at 15:02 , Richard O'Keefe <raoknz using gmail.com> wrote:
> 
> "ifelse is very slow"?  Benchmark time.
>> x <- runif(1000000)
>> y <- runif(1000000)
>> system.time(ifelse(x < y, x, y))
>   user  system elapsed
>  0.403   0.044   0.448
>> system.time(y + (x < y)*(x - y))
>   user  system elapsed
>  0.026   0.012   0.038
> 
> This appears to be a quality-of-implementation bug.
> 
> 
> On Thu, 11 Jul 2019 at 04:14, Dénes Tóth <toth.denes using kogentum.hu> wrote:
> 
>> 
>> 
>> On 7/10/19 5:54 PM, Richard O'Keefe wrote:
>>> Expectation: ifelse will use the same "repeat vectors to match the
>> longest"
>>> rule that other vectorised functions do.  So
>>> a <- 1:5
>>> b <- c(2,3)
>>> ifelse(a < 3, 1, b)
>>> => ifelse(T T F F F <<5>>, 1 <<1>>, 2 3 <<2>>)
>>> => ifelse(T T F F F <<5>>, 1 1 1 1 1 <<5>>, 2 3 2 3 2 <<5>>)
>>> => 1 1 2 3 2
>>> and that is indeed the answer you get.  Entirely predictable and
>> consistent
>>> with
>>> other basic operations in R.
>>> 
>>> The only tricky thing I see is that R has
>>> a strict vectorised  ifelse(logical.vector, some.vector, another.vector)
>>> AND
>>> a non-strict non-vectorised if (logical.scalar) some.value else
>>> another.value
>>> AND
>>> a statement form if (logical.scalar) stmt.1; else stmt.2;
>> 
>> Just for the records, there is a further form:
>> `if`(logical.scalar, stmt.1, stmt.2)
>> 
>> The main problem with ifelse is that 1) it is very slow, and 2) the mode
>> of its return value can be unintuitive or not too predictable (see also
>> the Value and Warning sections of ?ifelse). One has to be very careful
>> and ensure that 'yes' and 'no' vectors have the same class, because
>> ifelse will not warn you at all:
>>> ifelse(c(TRUE, TRUE), 1:2, LETTERS[1:2])
>> [1] 1 2
>>> ifelse(c(TRUE, FALSE), 1:2, LETTERS[1:2])
>> [1] "1" "B"
>> 
>> For options instead of base::ifelse, you might find this discussion
>> helpful:
>> https://github.com/Rdatatable/data.table/issues/3657
>> 
>> 
>> Cheers,
>> Denes
>> 
>> 
>>> 
>>> 
>>> On Thu, 11 Jul 2019 at 01:47, Eric Berger <ericjberger using gmail.com> wrote:
>>> 
>>>> For example, can you predict what the following code will do?
>>>>> a <- 1:5
>>>>> b <- c(2,3)
>>>>> ifelse( a < 3, 1, b)
>>>> 
>>>> 
>>>> On Wed, Jul 10, 2019 at 4:34 PM José María Mateos <chema using rinzewind.org>
>>>> wrote:
>>>> 
>>>>> On Wed, Jul 10, 2019, at 04:39, Eric Berger wrote:
>>>>>> 1. The ifelse() command is a bit tricky in R. Avoiding it is often a
>>>> good
>>>>>> policy.
>>>>> 
>>>>> You piqued my curiosity, can you elaborate a bit more on this?
>>>>> 
>>>>> --
>>>>> José María (Chema) Mateos || https://rinzewind.org
>>>>> 
>>>>> ______________________________________________
>>>>> R-help using 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.
>>>>> 
>>>> 
>>>>         [[alternative HTML version deleted]]
>>>> 
>>>> ______________________________________________
>>>> R-help using 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.
>>>> 
>>> 
>>>      [[alternative HTML version deleted]]
>>> 
>>> ______________________________________________
>>> R-help using 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.
>>> 
>> 
> 
> 	[[alternative HTML version deleted]]
> 
> ______________________________________________
> R-help using 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
Office: A 4.23
Email: pd.mes using cbs.dk  Priv: PDalgd using gmail.com



More information about the R-help mailing list