【问题标题】:calculate fat free mass and apply the function to data set计算无脂肪质量并将函数应用于数据集
【发布时间】:2014-12-02 13:24:59
【问题描述】:

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

 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 并为每个人应用该函数。能否请你帮忙?

提前致谢!

【问题讨论】:

  • 你想要sql中的答案吗?我不太确定我需要用什么语言来写它
  • @Alex 我不确定你所说的 sql 是什么意思。答案将是一个数字。我想在名为 (FFM) 的数据集中添加一个新列,其中包含分析器。与每个人的 BMI 列的样式相同。
  • 你的代码是什么语言的?
  • 你的女性公式有问题:> FMCalFemale(80, 30) ans:[1] 84.17707 。 FFM 怎么可能超过 WEIGHT? (虽然这不是 R 语言问题)
  • @rnso 你是对的 =) 我错过了等式中的一些内容。它应该是 FFM=9270*WT/(8780+244*BMI)。感谢您的关注:)

标签: r dataframe


【解决方案1】:

你可以使用ifelse

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

【讨论】:

    【解决方案2】:

    这里有两种方法,一种只是获取数据框(假设它包含名称为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))
    }
    

    【讨论】:

      【解决方案3】:

      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
      

      【讨论】:

        猜你喜欢
        • 2012-05-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-06-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多