如何基于分组变量及前置行条件为器官移植数据编码新变量
器官移植肺部数据集新增outcome变量解决方案
需求说明
处理按捐赠者分组的肺部移植数据集,新增outcome变量,规则如下:
- 当
organ_placed取值为L/R/B时,outcome分别对应标记为Left Single/Right Single/Bilateral - 若捐赠者已安置单侧肺(数据中出现过
L或R),另一侧肺最终无匹配结果(该捐赠者最大sequence行的organ_placed为NA),则在该最大sequence行标记对应的[Side] Discarded(如示例中捐赠者3的右肺未安置,最后一行标记Right Discarded)
原始数据集
library(tidyverse) data <- tribble( ~donor_id, ~sequence, ~organ_placed, 1, 5, "L", 1, 10, "R", 2, 13, "B", 3, 4, "L", 3,69,NA, 3,70,NA, 3,71,NA, 3, 72, NA, )
期望输出
desired_data <- tribble( ~donor_id, ~sequence, ~organ_placed,~outcome, 1, 5, "L","Left Single", 1, 10, "R","Right Single", 2, 13, "B","Bilateral", 3, 4, "L","Left Single", 3,69,NA,NA, 3,70,NA,NA, 3,71,NA,NA, 3, 72, NA,"Right Discarded" )
补全后的代码实现
data <- data %>% group_by(donor_id) %>% mutate( # 标记当前行是否为该捐赠者的最大sequence行 is_max_seq = sequence == max(sequence), # 检查捐赠者已安置的肺类型 has_L = any(organ_placed == "L", na.rm = TRUE), has_R = any(organ_placed == "R", na.rm = TRUE), # 补全outcome逻辑 outcome = case_when( organ_placed == "L" ~ "Left Single", organ_placed == "R" ~ "Right Single", organ_placed == "B" ~ "Bilateral", # 最大sequence行且organ_placed为NA,且已安置左肺但未安置右肺 → 标记右肺丢弃 is_max_seq & is.na(organ_placed) & has_L & !has_R ~ "Right Discarded", # 最大sequence行且organ_placed为NA,且已安置右肺但未安置左肺 → 标记左肺丢弃 is_max_seq & is.na(organ_placed) & has_R & !has_L ~ "Left Discarded", # 其他NA情况标记为NA TRUE ~ NA_character_ ) ) %>% # 移除临时辅助列 select(-is_max_seq, -has_L, -has_R) %>% ungroup()
代码逻辑解释
- 分组处理:按
donor_id分组,确保每个捐赠者的逻辑独立计算 - 辅助变量计算:
is_max_seq:标记当前行是否为该捐赠者的最大sequence行(即最后一条记录)has_L/has_R:检查该捐赠者是否已安置左/右肺
- case_when补全:
- 针对最大
sequence行且organ_placed为NA的情况,根据已安置的肺类型,标记对应另一侧肺为丢弃状态 - 其他NA情况保持为NA
- 针对最大
内容的提问来源于stack exchange,提问作者John Ryan
相关产品推荐
相关产品推荐

