我正在尝试使用条件计算基于多个现有变量的值来计算新变量。具体来说,新变量是肾功能(eGFR),它是根据一个人的性别,年龄,是(非)黑人和两个血液成分(肌酐和半胱氨酸蛋白酶抑制剂C)的浓度估算的。
我尝试使用R的if ... else语句来完成此操作,但是遇到警告消息,此后未发生任何提示。所有变量都包含在数据框“ d”中。
基本上,我希望R做的是:如果受试者是男性(== 1)和非黑人(!= 1),其血液肌酐≤0.9,而胱抑素C≤0.8,则通过以下方式估算一个人的肾脏功能:
等等。为此,我应用了以下代码:
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 = Negroid,!= 1为非Negroid),肌酐,胱抑素C,以及用于公式验证的手动计算的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")
答案 0 :(得分:2)
我相信下面的函数遵循问题中的定义,但是由于没有数据和预期的输出,因此未经测试。
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)
答案 1 :(得分:0)
正如John Coleman所建议的以及Rui Barradas提供的功能一样,嵌套多个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))))))))))))))))