计算无脂肪质量并将该函数应用于数据集

时间:2014-10-08 00:43:21

标签: r dataframe

我有一个如下所示的数据集:

 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

我想计算无脂肪质量(FFM)并将值附加到数据集中的每个人的新列中。这些是为男性和女性计算FFM的功能:

男性(SEX = 1):

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

和女性(SEX = 2):

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

}

我想修改此功能,以便检查SEX(1,男性或2是女性),然后根据该功能计算FFM,并为每个人应用该功能。能否请你帮忙?

提前致谢!

3 个答案:

答案 0 :(得分:1)

您可以使用ifelse

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

答案 1 :(得分:1)

data.table方法:

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

答案 2 :(得分:0)

以下是两种方法,一种只是采用数据框(假设它包含名称为SEXWEIGHTBMI的列:

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

或您最初格式化它,但添加了SEX参数:

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