Amer
Amer

Reputation: 2251

calculate fat free mass and apply the function to data set

I have a dataset that looks like this:

 ID SEX WEIGHT  BMI
 1  2   65      25
 1  2   65      25
 1  2   65      25
 2  1   70      30
 2  1   70      30
 2  1   70      30
 2  1   70      30
 3  2   50      18
 3  2   50      18
 4  1   85      20
 4  1   85      20

I want to calculate fat free mass (FFM) and attach the value in a new column in the dataset for each individual. These are the functions to calculate FFM for males and females:

for males (SEX=1):

FFMCalMale <- function (WEIGHT, BMI) {
FFM = 9270*WEIGHT/(6680+216*BMI)
}

and for females (SEX=2):

FFMCalFemale <- function(WEIGHT, BMI) {
FFM = 9270*WEIGHT/(8780+244*BMI)

}

I want to modify this function so it check for the SEX (1, male or 2 is female) then do the calculation for FFM based on that and apply the function for each individual. Could you please help?

Thanks in advance!

Upvotes: 0

Views: 171

Answers (3)

KFB
KFB

Reputation: 3501

A data.table approach:

mydata <- read.table(
  header = T, con <- textConnection
  ('
ID SEX WEIGHT  BMI
1  2   65      25
1  2   65      25
1  2   65      25
2  1   70      30
2  1   70      30
2  1   70      30
2  1   70      30
3  2   50      18
3  2   50      18
4  1   85      20
4  1   85      20
   '), stringsAsFactors = FALSE)
close(con)
library(data.table) ## load data.table
setDT(mydata) ## convert the data to datatable
FFMCalMale <- function (WEIGHT, BMI) {
  FFM = 9270*WEIGHT/(6680+216*BMI)
}
FFMCalFemale <- function(WEIGHT, BMI) {
  FFM = 9270*WEIGHT/(8780+BMI) 
}
setkey(mydata, SEX)
mydata[, FFM := ifelse(SEX == 1,
                       FFMCalMale(WEIGHT, BMI),
                       FFMCalFemale(WEIGHT, BMI))][]

#    ID SEX WEIGHT BMI      FFM
# 1:  2   1     70  30 49.30851
# 2:  2   1     70  30 49.30851
# 3:  2   1     70  30 49.30851
# 4:  2   1     70  30 49.30851
# 5:  4   1     85  20 71.63182
# 6:  4   1     85  20 71.63182
# 7:  1   2     65  25 68.43271
# 8:  1   2     65  25 68.43271
# 9:  1   2     65  25 68.43271
# 10:  3   2     50  18 52.68243
# 11:  3   2     50  18 52.68243

Upvotes: 1

Sean Hughes
Sean Hughes

Reputation: 358

Here are two ways, one just taking the dataframe (assuming it contains columns with the names SEX, WEIGHT, and BMI):

dffunc <- function(dataframe) {
   ifelse(dataframe$SEX == 1, 
      9270 * dataframe$WEIGHT / (6680 + 216 * dataframe$BMI), 
      9270 * dataframe$WEIGHT / (8780 + dataframe$BMI))
}

or as you originally formatted it, but adding the SEX parameter:

func <- function(WEIGHT, BMI, SEX) {
   ifelse(SEX == 1, 
      9270 * WEIGHT / (6680 + 216 * BMI), 
      9270 * WEIGHT / (8780 + BMI))
}

Upvotes: 0

nograpes
nograpes

Reputation: 18323

You could use ifelse

data$FFM <- ifelse(data$SEX==1, 
                   FFMCalMale(data$WEIGHT, data$BMI), 
                   FFMCalFemale(data$WEIGHT, data$BMI))

Upvotes: 1

Related Questions