[R] if() command

Roger Bivand Roger.Bivand at nhh.no
Wed Sep 14 19:40:54 CEST 2005


On Wed, 14 Sep 2005, Carlos Mauricio Cardeal Mendes wrote:

> Ok Petr, I run your suggestion and I got this message:
> 
>  > age<-sample(seq(10,50,10), 20, replace=T)
>  >
>  > if (age <=10) {group <- 1} else if (age > 10 & age <= 20) {group <- 
> 2} else {group <- 3}
> Warning message:
> the condition has length > 1 and only the first element will be used in: 
> if (age <= 10) {
> 
> What does it means ?
> 
> And when I look to the database I have no new classification !
> 

Although the syntax issue is real, if() is not the way to go if you are 
comparing a vector with a scalar; if() will only compare the first element 
of the vector with the scalar. The ifelse() function is vectorised:

> age<-sample(seq(10,50,10), 20, replace=T)
> group_ifelse <- ifelse(age > 10, ifelse(age > 20, 3, 2), 1)
> group_ifelse
 [1] 3 2 3 3 3 2 3 3 1 2 3 1 1 1 3 2 3 2 3 3

or maybe even better, use the cut function to create a grouping factor:

> group_cut <- cut(age, breaks=c(0,10,20,100), include.lowest=TRUE)
> group_cut
 [1] (20,100] (10,20]  (20,100] (20,100] (20,100] (10,20]  (20,100] (20,100]
 [9] [0,10]   (10,20]  (20,100] [0,10]   [0,10]   [0,10]   (20,100] (10,20] 
[17] (20,100] (10,20]  (20,100] (20,100]
Levels: [0,10] (10,20] (20,100]
> age
 [1] 30 20 30 40 30 20 50 50 10 20 30 10 10 10 30 20 40 20 50 40
> as.integer(group_cut)
 [1] 3 2 3 3 3 2 3 3 1 2 3 1 1 1 3 2 3 2 3 3

Sometimes you need to enclose cut() within ordered(), and if there are 
empty intervals, you may not get what you expect from the integer 
representation of the result. Yet another elegant function is 
findInterval():

> group_findInterval <- findInterval(age, c(0,10.001,20.001,100))
> group_findInterval
 [1] 3 2 3 3 3 2 3 3 1 2 3 1 1 1 3 2 3 2 3 3

Hope this helps

> Could you help please ?
> 
> Mauricio
> 
> Petr Pikal escreveu:
> 
> > Hallo
> >
> >
> > On 13 Sep 2005 at 10:29, Carlos Maurício Cardeal Mende wrote:
> >
> >> Hi everyone !
> >>
> >> Could you please help me with this problem ?
> >>
> >> I´ve trying to write a code that assign to a variable the content from
> >> another, but all I´ve got is a message error. For example:
> >>
> >> if (age <=10) {group == 1}
> >> else if (age > 10 & age <= 20) {group == 2}
> >> else {group == 3}
> >
> > if you put your statement on one line it works (at least it does not 
> > give you syntax error) but the result is hardly what you really expect
> >
> > age<-sample(seq(10,50,10), 20, replace=T)
> >
> > if (age <=10) {group <- 1} else if (age > 10 & age <= 20) {group <- 2} 
> > else {group <- 3}
> > if (age <=10) {group == 1} else if (age > 10 & age <= 20) {group == 2} 
> > else {group == 3}
> >
> > Maybe you want something like
> >
> > group<-as.numeric(cut(age,c(0,10,20,100)))
> >
> > but it is only guess
> >
> > HTH
> > Petr
> >
> >>
> >> Syntax error
> >>
> >> Or
> >>
> >> if (age <=10) {group == 1}
> >> else (age > 10 & age <= 20) {group == 2}
> >> else {group == 3}
> >>
> >> Syntax error
> >>
> >> I know that is possible to find the solution by ifelse command or even
> >> recode command, but I´d like to use this way, because I can add
> >> another variable as a new condition and I believe to expand the
> >> possibilites.
> >>
> >> Thanks,
> >> Mauricio
> >>
> >> ______________________________________________
> >> R-help at stat.math.ethz.ch mailing list
> >> https://stat.ethz.ch/mailman/listinfo/r-help
> >> PLEASE do read the posting guide!
> >> http://www.R-project.org/posting-guide.html
> >
> >
> > Petr Pikal
> > petr.pikal at precheza.cz
> >
> >------------------------------------------------------------------------
> >
> >No virus found in this incoming message.
> >Checked by AVG Anti-Virus.
> >Version: 7.0.344 / Virus Database: 267.10.21/96 - Release Date: 10/9/2005
> >  
> >
> 
> ______________________________________________
> R-help at stat.math.ethz.ch mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html
> 

-- 
Roger Bivand
Economic Geography Section, Department of Economics, Norwegian School of
Economics and Business Administration, Helleveien 30, N-5045 Bergen,
Norway. voice: +47 55 95 93 55; fax +47 55 95 95 43
e-mail: Roger.Bivand at nhh.no




More information about the R-help mailing list