Как вычислить новую переменную в R на основе значений нескольких других переменных? - PullRequest
0 голосов
/ 06 июля 2019

Я пытаюсь вычислить новую переменную на основе значений нескольких существующих переменных с условным вычислением.В частности, новой переменной является функция почек (eGFR), которая оценивается на основе пола, возраста, наличия (не) негроида и концентрации двух компонентов крови (т. Е. Креатинина и цистатина C).

Я пытался сделать это с помощью оператора R's if ... else, но обнаружил предупреждающее сообщение, после чего ничего не происходит.Все переменные содержатся во фрейме данных 'd'.

По сути, я хотел бы, чтобы R сделал следующее: если субъект имеет мужской пол (== 1) и не негроидный (! = 1), имеет в крови креатинин ≤ 0,9 и цистатин C ≤ 0,8, затем функция почек оценивается следующим образом:

https://latex.codecogs.com/png.latex?\bg_white&space;eGFR=135\cdot\left&space;(&space;\frac{creatinine}{0.9}&space;\right&space;)^{-0.207}\cdot\left&space;(&space;\frac{cystatinC}{0.8}&space;\right&space;)^{-0.375}\cdot0.995^{age}

и так далее.Для этой цели я применил следующий фрагмент кода:

if (d$sex == 1 & d$creatinine <= 0.9 & d$cystatinC <= 0.8 & d$race != 1){ ### Non-Negroid males
    d$eGFR <- 135 * I((d$creatinine / 0.9)^-0.207) * I((d$cystatinC / 0.8)^-0.375) * I((0.995)^d$age)
  } else if (d$sex == 1 & d$creatinine <= 0.9 & d$cystatinC > 0.8 & d$race != 1){
    d$eGFR <- 135 * I((d$creatinine / 0.9)^-0.207) * I((d$cystatinC / 0.8)^-0.711) * I((0.995)^d$age)
  } else if (d$sex == 1 & d$creatinine > 0.9 & d$cystatinC <= 0.8 & d$race != 1){
    d$eGFR <- 135 * I((d$creatinine / 0.9)^-0.601) * I((d$cystatinC / 0.8)^-0.375) * I((0.995)^d$age)
  } else if (d$sex == 1 & d$creatinine > 0.9 & d$cystatinC > 0.8 & d$race != 1){
    d$eGFR <- 135 * I((d$creatinine / 0.9)^-0.601) * I((d$cystatinC / 0.8)^-0.711) * I((0.995)^d$age)
  } else if (d$sex == 0 & d$creatinine <= 0.7 & d$cystatinC <= 0.8 & d$race != 1){ ### Non-Negroid females
    d$eGFR <- 130 * I((d$creatinine / 0.7)^-0.248) * I((d$cystatinC / 0.8)^-0.375) * I((0.995)^d$age)
  } else if (d$sex == 0 & d$creatinine <= 0.7 & d$cystatinC > 0.8 & d$race != 1){
    d$eGFR <- 130 * I((d$creatinine / 0.7)^-0.248) * I((d$cystatinC / 0.8)^-0.711) * I((0.995)^d$age)
  } else if (d$sex == 0 & d$creatinine > 0.7 & d$cystatinC <= 0.8 & d$race != 1){
    d$eGFR <- 130 * I((d$creatinine / 0.7)^-0.601) * I((d$cystatinC / 0.8)^-0.375) * I((0.995)^d$age)
  } else if (d$sex == 0 & d$creatinine > 0.7 & d$cystatinC > 0.8 & d$race != 1){
    d$eGFR <- 130 * I((d$creatinine / 0.7)^-0.601) * I((d$cystatinC / 0.8)^-0.711) * I((0.995)^d$age)
  } else if (d$sex == 1 & d$creatinine <= 0.9 & d$cystatinC <= 0.8 & d$race == 1){ ### Negroid males
    d$eGFR <- 145.8 * I((d$creatinine / 0.9)^-0.207) * I((d$cystatinC / 0.8)^-0.375) * I((0.995)^d$age)
  } else if (d$sex == 1 & d$creatinine <= 0.9 & d$cystatinC > 0.8 & d$race == 1){
    d$eGFR <- 145.8 * I((d$creatinine / 0.9)^-0.207) * I((d$cystatinC / 0.8)^-0.711) * I((0.995)^d$age)
  } else if (d$sex == 1 & d$creatinine > 0.9 & d$cystatinC <= 0.8 & d$race == 1){
    d$eGFR <- 145.8 * I((d$creatinine / 0.9)^-0.601) * I((d$cystatinC / 0.8)^-0.375) * I((0.995)^d$age)
  } else if (d$sex == 1 & d$creatinine > 0.9 & d$cystatinC > 0.8 & d$race == 1){
    d$eGFR <- 145.8 * I((d$creatinine / 0.9)^-0.601) * I((d$cystatinC / 0.8)^-0.711) * I((0.995)^d$age)
  } else if (d$sex == 0 & d$creatinine <= 0.7 & d$cystatinC <= 0.8 & d$race == 1){ ### Negroid females
    d$eGFR <- 140.4 * I((d$creatinine / 0.7)^-0.248) * I((d$cystatinC / 0.8)^-0.375) * I((0.995)^d$age)
  } else if (d$sex == 0 & d$creatinine <= 0.7 & d$cystatinC > 0.8 & d$race == 1){
    d$eGFR <- 140.4 * I((d$creatinine / 0.7)^-0.248) * I((d$cystatinC / 0.8)^-0.711) * I((0.995)^d$age)
  } else if (d$sex == 0 & d$creatinine > 0.7 & d$cystatinC <= 0.8 & d$race == 1){
    d$eGFR <- 140.4 * I((d$creatinine / 0.7)^-0.601) * I((d$cystatinC / 0.8)^-0.375) * I((0.995)^d$age)
  } else if (d$sex == 0 & d$creatinine > 0.7 & d$cystatinC > 0.8 & d$race == 1){
    d$eGFR <- 140.4 * I((d$creatinine / 0.7)^-0.601) * I((d$cystatinC / 0.8)^-0.711) * I((0.995)^d$age)
  }

Однако при запуске этого R выдает:

Warning message:
In if (d$sex == 1 & d$creatinine <= 0.9 & d$cystatinC <= 0.8 &  :
  the condition has length > 1 and only the first element will be used

Кто-нибудь, кто может мне помочь?

ОБНОВЛЕНИЕ: Ниже приведены некоторые выборочные данные, включая возраст, пол (0 = женщина, 1 = мужчина), расу (1 = негроид,! = 1 не негроидный), креатинин, цистатин С иeGFR, рассчитанный вручную для проверки формулы:

reconstruct <- structure(list(sex = structure(c(2L, 2L, 2L, 2L, 1L, 1L, 2L, 
2L, 1L, 2L), .Label = c("0", "1"), class = "factor"), race = structure(c(1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 3L), .Label = c("0", "1", "2", 
"3", "4"), class = "factor"), age = c(71.9425051334702, 65.1964407939767, 
46.2258726899384, 51.7152635181383, 54.8747433264887, 71.6714579055441, 
36.0793976728268, 54.3764544832307, 57.9110198494182, 49.9438740588638
), creatinine = c(0.633484162895928, 0.984162895927602, 0.769230769230769, 
0.8710407239819, 0.769230769230769, 0.690045248868778, 0.893665158371041, 
1.02941176470588, 0.83710407239819, 0.701357466063348), cystatinC = c(0.73, 
0.85, 0.64, 0.9, 0.83, 0.95, 1.04, 1, 0.95, 0.68), eGFR =     c(96.1605293085191, 
73.17567750685, 105.934761135043, 80.8974371814808, 103.186483803272, 
88.1306212690947, 77.7383905116244, 66.9892381719287, 90.7223944432609, 
107.443909414004)), row.names = c(NA, 10L), class = "data.frame")

Ответы [ 2 ]

2 голосов
/ 06 июля 2019

Я полагаю, что приведенная ниже функция соответствует тому, что определено в вопросе, но она не проверена, поскольку нет данных и ожидаемого результата.

eGFRfun <- function(DF){
  i_sex <- DF[["sex"]] == 1
  i_creat_0.9 <- DF[["creatinine"]] <= 0.9
  i_creat_0.7 <- DF[["creatinine"]] <= 0.7
  i_cyst <- DF[["cystatinC"]] <= 0.8
  i_race <- DF[["race"]] == 1

  const_fac <- ifelse(i_race, 135, 145.8) + 5*(i_sex - 1)
  creat_denom <- ifelse(i_sex, 0.9, 0.7)
  creat_pow <- ifelse(i_sex & i_creat_0.9, -0.207, -0.601)
  creat_pow <- ifelse(i_sex & i_creat_0.7, -0.248, -0.601)
  cystC_fac <- (DF[["cystatinC"]] / 0.8)^ifelse(i_cyst, -0.375, -0.711)
  age_fac <- 0.995^DF[["age"]]

  const_fac * (DF[["creatinine"]] / creat_denom)^creat_pow * cystC_fac * age_fac
}

Пример использования:

d$eGFR <- eGFRfun(d)
0 голосов
/ 09 июля 2019

Как уже предложено Джон Коулман , а также функция, предоставляемая Руи Баррадасом , вложение нескольких операторов ifelse вместо построения if ... else дает желаемый результат.

Действительно, следующий фрагмент кода далеко не эффективен и трудно читаем, но он прекрасно работает:

  ifelse(d$sex == 1 & d$creatinine <= 0.9 & d$cystatinC <= 0.8 & d$race != 1, ### Non-Negroid males
   d$eGFR <- 135 * ((d$creatinine / 0.9)^-0.207) * ((d$cystatinC / 0.8)^-0.375) * ((0.995)^d$age),
   ifelse(d$sex == 1 & d$creatinine <= 0.9 & d$cystatinC > 0.8 & d$race != 1,
   d$eGFR <- 135 * ((d$creatinine / 0.9)^-0.207) * ((d$cystatinC / 0.8)^-0.711) * ((0.995)^d$age),
   ifelse(d$sex == 1 & d$creatinine > 0.9 & d$cystatinC <= 0.8 & d$race != 1,
   d$eGFR <- 135 * ((d$creatinine / 0.9)^-0.601) * ((d$cystatinC / 0.8)^-0.375) * ((0.995)^d$age),
   ifelse(d$sex == 1 & d$creatinine > 0.9 & d$cystatinC > 0.8 & d$race != 1,
   d$eGFR <- 135 * ((d$creatinine / 0.9)^-0.601) * ((d$cystatinC / 0.8)^-0.711) * ((0.995)^d$age),
   ifelse(d$sex == 0 & d$creatinine <= 0.7 & d$cystatinC <= 0.8 & d$race != 1,  ### Non-Negroid females
   d$eGFR <- 130 * ((d$creatinine / 0.7)^-0.248) * ((d$cystatinC / 0.8)^-0.375) * ((0.995)^d$age),
   ifelse(d$sex == 0 & d$creatinine <= 0.7 & d$cystatinC > 0.8 & d$race != 1,
   d$eGFR <- 130 * ((d$creatinine / 0.7)^-0.248) * ((d$cystatinC / 0.8)^-0.711) * ((0.995)^d$age),
   ifelse(d$sex == 0 & d$creatinine > 0.7 & d$cystatinC <= 0.8 & d$race != 1,
   d$eGFR <- 130 * ((d$creatinine / 0.7)^-0.601) * ((d$cystatinC / 0.8)^-0.375) * ((0.995)^d$age),
   ifelse(d$sex == 0 & d$creatinine > 0.7 & d$cystatinC > 0.8 & d$race != 1,
   d$egfr_nc2 <- 130 * ((d$creatinine / 0.7)^-0.601) * ((d$cystatinC / 0.8)^-0.711) * ((0.995)^d$age),
   ifelse(d$sex == 1 & d$creatinine <= 0.9 & d$cystatinC <= 0.8 & d$race == 1, ### Negroid males
   d$eGFR <- 145.8 *((d$creatinine / 0.9)^-0.207) * ((d$cysc_nc2 / 0.8)^-0.375) * ((0.995)^d$age),
   ifelse(d$sex == 1 & d$creatinine <= 0.9 & d$cystatinC > 0.8 & d$race == 1,
   d$eGFR <- 145.8 * ((d$creatinine / 0.9)^-0.207) * ((d$cystatinC / 0.8)^-0.711) * ((0.995)^d$age),
   ifelse(d$sex == 1 & d$creatinine > 0.9 & d$cystatinC <= 0.8 & d$race == 1,
   d$eGFR <- 145.8 * ((d$creatinine / 0.9)^-0.601) * ((d$cystatinC / 0.8)^-0.375) * ((0.995)^d$age),
   ifelse(d$sex == 1 & d$creatinine > 0.9 & d$cystatinC > 0.8 & d$race == 1,
   d$eGFR <- 145.8 * ((d$creatinine / 0.9)^-0.601) * ((d$cystatinC / 0.8)^-0.711) * ((0.995)^d$age),
   ifelse(d$sex == 0 & d$creatinine <= 0.7 & d$cystatinC <= 0.8 & d$race == 1, ### Negroid females
   d$eGFR <- 140.4 * ((d$creatinine / 0.7)^-0.248) * ((d$cystatinC / 0.8)^-0.375) * ((0.995)^d$age),
   ifelse(d$sex == 0 & d$creatinine <= 0.7 & d$cystatinC > 0.8 & d$race == 1,
   d$eGFR <- 140.4 * ((d$creatinine / 0.7)^-0.248) * ((d$cystatinC / 0.8)^-0.711) * ((0.995)^d$age),
   ifelse(d$sex == 0 & d$creatinine > 0.7 & d$cystatinC <= 0.8 & d$race == 1,
   d$eGFR <- 140.4 * ((d$creatinine / 0.7)^-0.601) * ((d$cystatinC / 0.8)^-0.375) * ((0.995)^d$age),
   ifelse(d$sex == 0 & d$creatinine > 0.7 & d$cystatinC > 0.8 & d$race == 1,
   d$eGFR <- 140.4 * ((d$creatinine / 0.7)^-0.601) * ((d$cystatinC / 0.8)^-0.711) * ((0.995)^d$age),
   NA))))))))))))))))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...