[R] How to modify function for list

Chung-hong Chan chainsawtiney at gmail.com
Wed Oct 3 11:05:05 CEST 2007


Yeah, it works fine now.
I think I need to modify my function to check for factor.

Regards,
C


On 10/3/07, Duncan Murdoch <murdoch at stats.uwo.ca> wrote:
> On 03/10/2007 2:23 AM, Chung-hong Chan wrote:
> > Thanks for your answer. But I have a strange question that I don't
> > know how to explain and I really don't know how to spot the
> > problematic part.
> >
> > Suppose I have a long list of age, gender and bmi from a data.frame
> > called msltdata.
> >
> >> age <- msltdata$age
> >> gender <- msltdata$data
> >> bmi <-msltdata$bmi
> >> age
> > [1]  5 10 14
> >> gender
> > [1] 0 0 0
> > Levels: 0 1
>
> gender is a factor.  The values are stored as indices into the Levels
> vector, so 0 is stored as 1 and 1 would be stored as 2.
>
> Factors commonly arise when you read a dataset from a file, and R thinks
> one of the columns is a set of character values rather than numbers.
>
> To convert gender to a numeric value, you can do this:
>
> gender <- as.numeric(as.character(gender))
>
> but I'd recommend avoiding factors in the first place.
>
> Duncan Murdoch
>
> >> bmi
> > [1] 17.17693 16.40702 16.87695
> >> mapply(bmisds,age,gender,bmi)
> >
> > however, when I try to create the vectors once again using the same data, i.e.
> >> age <- c(5,10,14)
> >> gender <- c(0,0,0)
> >> bmi <- c(17.17693,16.40702,16.87695)
> >> mapply(bmisds,age,gender,bmi)
> >
> > This time, I can get the correct calculation.
> > Would anyone please give me some hints to find out what's went wrong?
> >
> > Regards,
> > C
> >
> >
> > On 10/3/07, Christos Hatzis <christos at nuverabio.com> wrote:
> >> Instead of
> >>
> >>> bmisds(age,gender,bmi)
> >> Try the vectorized version
> >>
> >>> mapply(bmisds, age, gender, bmi)
> >> See ?mapply
> >>
> >> -Christos
> >>
> >>
> >>
> >>> -----Original Message-----
> >>> From: r-help-bounces at r-project.org
> >>> [mailto:r-help-bounces at r-project.org] On Behalf Of Chung-hong Chan
> >>> Sent: Wednesday, October 03, 2007 12:31 AM
> >>> To: r-help at stat.math.ethz.ch
> >>> Subject: [R] How to modify function for list
> >>>
> >>> Dear R Gurus,
> >>>
> >>> I have a function which calculate the BMI standard deviation
> >>> score based on the age and gender specific L, M, S value.
> >>> I have written a function like this
> >>>
> >>> bmisds <- function (age, gender, bmi){
> >>>   if (age ==1 & gender ==1)
> >>>     {
> >>>       bmif <- c(-1.013,16.133,0.07656)
> >>>     }
> >>>   else if (age ==1 & gender ==0)
> >>>     {
> >>>       bmif <- c(-1.79,16.421,0.07149)
> >>>     }
> >>>   else if (age == 2 & gender == 1)
> >>>     {
> >>>       bmif <- c(-1.403,15.58,0.07342)
> >>>     }
> >>>   else if (age == 2 & gender == 0)
> >>>     {
> >>>       bmif <- c(-2.045,15.861,0.07116)
> >>>     }
> >>> ....
> >>>
> >>>       (((bmi/bmif[2])**bmif[1] -1)/(bmif[1]*bmif[3])) }
> >>>
> >>> This function work when I supply a single variable, e.g.
> >>> bmisds(1,0,16)
> >>>
> >>> When I try it with a list, e.g.
> >>> age <- c(12,13,14)
> >>> gender <- c(0,1,1)
> >>> bmi <- c(14,15,16)
> >>> bmisds(age,gender,bmi)
> >>>
> >>> This function give me wrong answer and error msg.
> >>> Warning messages:
> >>> 1: the condition has length > 1 and only the first element
> >>> will be used in: if (age == 1 & gender == 1) {
> >>>
> >>>
> >>> How can I midify this function to work with list/vector?
> >>>
> >>> regards,
> >>> C
> >>>
> >>>
> >>> --
> >>> CH Chan
> >>> Research Assistant - KWH
> >>> http://www.macgrass.com
> >>>
> >>> ______________________________________________
> >>> R-help at r-project.org mailing list
> >>> 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.
> >>>
> >>>
> >>
> >>
> >
> >
>
>


-- 
CH Chan
Research Assistant - KWH
http://www.macgrass.com



More information about the R-help mailing list