[R] ifelse logic and multiple assignments

David Winsemius dwinsemius at comcast.net
Wed Mar 10 18:31:24 CET 2010


On Mar 10, 2010, at 11:47 AM, David Young wrote:

> I'm a fairly new R user and while I have a solution to my problem I'm
> wondering if there is a better one.
>
> In SAS it's common to use if/then logic along with a "do" statement to
> make several things happen.  While I could do the same thing in R
> using a "for" loop, and "if" and {}, I've read that loops are less
> common in R and I wonder if I'm doing things ineffectively.
>
> Below I've used a "ifelse" function to make an assignment to the
> variable FUT.direction, but what I'd really like to do is make several
> assignments based on the same "ifelse" logic.  Since the "ifelse"
> wants to create a vector the same size as the logical condition it
> doesn't seem obvious how I'd make several assignments and I worry
> about simply re-writing the logic for each assignment for fear of
> introducing errors that would be hard to find later.
>
> minitest$FUT.direction <-
>  ifelse((minitest$FUT.lm.max.3.20.r2.price == max),
>    ifelse((minitest$FUT.lm.max.3.20.slope.price > 0),1, 2),
>    ifelse((minitest$FUT.lm.min.3.20.r2.price == max),

My wet-ware interpreter says that condition would never be satisfied  
and probably not processed when you expected it to be, since any  
conditions satisfying that antecedent (minitest$FUT.lm.min. 
3.20.r2.price == max)  would have already been processed above that  
line and what follows would be ignored, so I suppose the fact that the  
positive consequent is the same is consistent at least. But if you  
were hoping that anything following that would be processed might be  
misplaced because of the nested fashion in which you wrote it.

>      ifelse((minitest$FUT.lm.min.3.20.slope.price > 0),1, 2),   
> #redundant
>      ifelse((minitest$FUT.lm.max.21.100.r2.avg.price == max),  #  
> repeated below
>        ifelse((minitest$FUT.lm.max.21.100.slope.avg.price > 0),3, 4),
>        ifelse((minitest$FUT.lm.min.21.100.r2.avg.price == max),    
> #likewise redundant
>          ifelse((minitest$FUT.lm.min.21.100.slope.avg.price > 0),3,  
> 4), #likewise redundant
>          ifelse((NA == max),NA,NA)
>        )
>      )
>    )
>  )
>
> Should I just go ahead with the "for" loop or does someone know of a
> better way to use one set of logic (by observation) to make several
> assignments?

With so much unnecessary code and no information about what the real  
problem structure looks like, it is _really_ hard to know. Certainly  
radical simplification of the above would be possible. It is also   
possible that you would gain some flexibility by looking at the match  
function.

SAS has an implicit for-loop in its DATA steps and the corresponding,  
possibly inefficient, R construction would be:

for (idx in seq_along(dtfrm) { if (cond-on-idx-ed-values) {  <multiple- 
ops> } else
                                             { <alternate-ops> }
                               }

>  Thanks in advance for any helpful advice.

My advice. Follow the Posting Guide and create a sample dataset and  
explain in ordinary English what you are attempting and what you want  
the results to be.

>
> -- 
> Best regards,
> David
>
-- 

David Winsemius, MD
West Hartford, CT



More information about the R-help mailing list