[R] How to modify function for list

Duncan Murdoch murdoch at stats.uwo.ca
Wed Oct 3 10:39:30 CEST 2007

```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:
>>
>>> 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
>>> http://www.R-project.org/posting-guide.html
>>> and provide commented, minimal, self-contained, reproducible code.
>>>
>>>
>>
>>
>
>

```