R语言实现基于用药哑变量组合调整hdl/ldl/trig指标
R实现用药相关血脂指标调整
直接按规则写即可,不需要做复杂的分支判断。
核心逻辑
你列出的两条调整规则可以合并为统一逻辑,不用单独判断观察对象的服药数量:对每个观察对象的hdl、ldl、trig三类血脂指标,分别选出该对象服用的所有药物对应调整常数中绝对值最大的项,和原始指标值做加法运算即可。单药场景下本身只有一个对应常数,天然符合该规则,能省掉多分支判断的冗余代码。
完整可运行代码
先运行你提供的模拟数据集生成代码,再接下面的计算逻辑即可,全程用基础R实现,不需要安装第三方依赖包:
# 定义各药物对应的三类血脂指标调整常数 med_adjust_map <- data.frame( med_name = c("med1", "med2", "med3", "med4", "med5"), hdl_delta = c(-3.5, -6.3, -5, 0, -2.1), ldl_delta = c(34.5, 24.7, 42.3, 23, 12), trig_delta = c(20.1, 0, 12, 22, 22.2) ) # cbind生成的是矩阵对象,先转成data.frame方便后续列操作 data <- as.data.frame(data) # 初始化三个调整后指标列 data[, c("adj_hdl", "adj_ldl", "adj_trig")] <- NA # 逐行计算调整后指标值 for (row_idx in 1:nrow(data)) { # 提取当前行观察对象服用的所有药物名称 used_meds <- c( ifelse(data$med1[row_idx] == 1, "med1", NA), ifelse(data$med2[row_idx] == 1, "med2", NA), ifelse(data$med3[row_idx] == 1, "med3", NA), ifelse(data$med4[row_idx] == 1, "med4", NA), ifelse(data$med5[row_idx] == 1, "med5", NA) ) used_meds <- used_meds[!is.na(used_meds)] # 匹配已服用药物对应的所有调整常数 matched_delta <- med_adjust_map[med_adjust_map$med_name %in% used_meds, ] # 对每个指标取绝对值最大的调整值 hdl_use <- matched_delta$hdl_delta[which.max(abs(matched_delta$hdl_delta))] ldl_use <- matched_delta$ldl_delta[which.max(abs(matched_delta$ldl_delta))] trig_use <- matched_delta$trig_delta[which.max(abs(matched_delta$trig_delta))] # 计算最终调整后的指标值 data$adj_hdl[row_idx] <- data$hdl[row_idx] + hdl_use data$adj_ldl[row_idx] <- data$ldl[row_idx] + ldl_use data$adj_trig[row_idx] <- data$trig[row_idx] + trig_use }
结果校验
你提到的两个示例场景计算结果完全符合规则要求:
- 仅服用med5的观察对象:匹配到的hdl调整值为-2.1、ldl调整值为12、trig调整值为22.2,和示例计算逻辑完全一致
- 同时服用med2、med3、med5的观察对象:hdl取med2的-6.3(绝对值6.3为三者最大)、ldl取med3的42.3(绝对值42.3为三者最大)、trig取med5的22.2(绝对值22.2为三者最大),和示例计算逻辑完全一致
小提示:如果你的数据集规模在十万行以上,可以把循环改成
dplyr行式操作或者向量化计算提升运行速度,当前示例的百行/万行级数据用循环写法可读性更强,计算结果没有任何差异。
内容的提问来源于stack exchange,提问作者celilati
相关产品推荐
相关产品推荐

