Re: [R] Learning, "if" and "else"

From: Adaikalavan Ramasamy <ramasamy_at_cancer.org.uk>
Date: Tue 14 Jun 2005 - 20:17:20 EST

You can also use switch() instead of ifelse(), which makes the code a bit easier to read. The downside to this is that switch does not take vectorised input and thus you need a loop. For example

 # data

 dbh  <- c(30,29,15,14,30,29)
 form <- factor(c("tree", "tree", "liana", "liana", "palm", "palm")) 
 df   <- data.frame(dbh, form)
 

 out <- numeric( nrow(df) )
 for(i in 1:nrow(df)){  

   x <- as.numeric( df[i, 1] )
   y <- as.character( df[i, 2] )

   out[i] <- switch( y,

              "tree"  = exp( -4.898 + 4.512*log(x) - 0.319*(log(x))^2 ),
              "liana" = 10^(0.07 + 2.17 * log10(x)),
              NA
                   )

 }

Or slightly more efficient solution is

 out <- apply( df, 1, function(z){
   x <- as.numeric(z[1]); y <- as.character(z[2])    

   switch( y,

          "tree"  = exp( -4.898 + 4.512*log(x) - 0.319*(log(x))^2 ),
          "liana" = 10^(0.07 + 2.17 * log10(x)),
          NA
          )

 })

Regards, Adai

On Mon, 2005-06-13 at 15:32 -0700, Paulo Brando wrote:
> Dear Rs,
>
> I have tried to use conditional expressions to calculate biomass for
> different life forms (trees, lianas, and palms).
>
> Here is an example:
>
> > lifeform
>
> dbh form
> 1 30 tree
> 2 29 tree
> 3 28 tree
> 4 27 tree
> 5 26 tree
> 6 25 tree
> 7 24 tree
> 8 23 tree
> 9 22 tree
> 10 21 tree
> 11 20 tree
> 12 15 liana
> 13 14 liana
> 14 13 liana
> 15 12 liana
> 16 11 liana
> 17 10 liana
> 18 9 liana
> 19 8 liana
> 20 7 liana
> 21 6 liana
> 22 5 liana
> 23 30 palm
> 24 29 palm
> 25 28 palm
> 26 27 palm
> 27 26 palm
> 28 25 palm
> 29 24 palm
> 30 23 palm
> 31 22 palm
> 32 21 palm
> 33 20 palm
>
> ### I want to include biomass
>
> lifeform$biomass <-
>
> {
> if(lifeform$form=="tree")
> exp(-4.898+4.512*log(dbh)-0.319*(log(dbh))^2)
> else{
> if (lifeform$form=="liana")
> 10^(0.07 + 2.17 * log10 (dbh))
> else ("NA")
> }
> Warning message:
> the condition has length > 1 and only the first element will be used in:
> if (lifeform$form == "tree") exp(-4.898 + 4.512 * log(dbh) -
>
>
> ### But I always get the message warning message above.
>
>
>
> I looked for similar examples in R mail list archive, but they did not
> help a lot.
>
> I am quite new to 'R'. Any material that covers this theme?
>
> Thank you very much!
>
> Paulo
>
> PS. Sorry about the last e-mail. I did not change the message title.
> ________________________________________
> Paulo M. Brando
> Instituto de Pesquisa Ambiental da Amazonia (IPAM)
> Santarem, PA, Brasil.
> Av. Rui Barbosa, 136.
> Fone: + 55 93 522 55 38
> www.ipam.org.br
> E-mail: pmbrando@ipam.org.br
>
> ______________________________________________
> R-help@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
>



R-help@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 Received on Tue Jun 14 20:55:21 2005

This archive was generated by hypermail 2.1.8 : Fri 03 Mar 2006 - 03:32:34 EST