R语言:基于分组变量结果创建新变量(器官捐赠场景)
器官捐赠数据集变量创建问题
背景
单个捐赠者可能参与两轮匹配(matchrun),左右肺拆分后各自进入匹配流程:每侧肺独立参与匹配轮次,按sequence筛选受赠者;匹配成功则在organ_placed标记"L"/"R",失败则在该轮次最大sequence处保留NA。
需求
创建新变量organ,规则如下:
- 若同一捐赠者的一侧肺匹配成功、另一侧失败:
- 成功侧标记为
Left Single(对应"L")或Right Single(对应"R") - 失败侧标记为
Left Discarded或Right Discarded
- 成功侧标记为
- 仅在每轮匹配的最大
sequence行标记,其余行留NA(参考期望输出)
数据集与期望输出
library(tibble) library(dplyr) # 原始数据集 data <- tribble( ~donorid, ~matchrun, ~sequence, ~organ_placed, 2, 3, 1, NA, 2, 3, 2, NA, 2, 3, 3, "L", 2, 4, 1, NA, 2, 4, 2, NA, 2, 4, 3, NA, 3, 5, 1, NA, 3, 5, 1, NA, 3, 5, 1, NA, 3, 6, 1, NA, 3, 6, 2, NA, 3, 6, 3, "L" ) # 期望输出 desired_outcome <- tribble( ~donorid, ~matchrun, ~sequence, ~organ_placed, ~organ, 2, 3, 1, NA, NA, 2, 3, 2, NA, NA, 2, 3, 3, "L", "Left Single", 2, 4, 1, NA, NA, 2, 4, 2, NA, NA, 2, 4, 3, NA, "Right Discarded", 3, 5, 1, NA, NA, 3, 5, 1, NA, NA, 3, 5, 1, NA, "Right Discarded", 3, 6, 1, NA, NA, 3, 6, 2, NA, NA, 3, 6, 3, "L", "Left Single")
解决方案
核心思路是先按donorid全局分组,确定该捐赠者成功匹配的器官类型;再按donorid + matchrun分组,标记每轮的最大sequence行,结合全局匹配结果生成organ变量。
result <- data %>% # 按捐赠者分组,提取该捐赠者所有成功匹配的器官类型 group_by(donorid) %>% mutate(placed_organs = list(unique(na.omit(organ_placed)))) %>% ungroup() %>% # 按捐赠者+匹配轮次分组,标记每轮的最大sequence行 group_by(donorid, matchrun) %>% mutate( is_max_seq = sequence == max(sequence), organ = case_when( # 非最大sequence行直接设为NA !is_max_seq ~ NA_character_, # 当前轮次匹配成功,生成对应Single标签 organ_placed == "L" ~ "Left Single", organ_placed == "R" ~ "Right Single", # 当前轮次匹配失败,根据捐赠者成功器官推断丢弃侧 is.na(organ_placed) & "L" %in% placed_organs ~ "Right Discarded", is.na(organ_placed) & "R" %in% placed_organs ~ "Left Discarded" ) ) %>% # 清理临时变量 select(-placed_organs, -is_max_seq) %>% ungroup() # 验证结果与期望一致 all.equal(result, desired_outcome) #> [1] TRUE
代码说明
- 全局标记成功器官:按
donorid分组后,提取该捐赠者所有成功匹配的器官类型,存入列表列placed_organs,用于后续判断丢弃侧。 - 标记轮次最大序列行:通过
sequence == max(sequence)筛选出每轮匹配的最终行,只有这些行需要标记organ变量。 - 生成organ变量:
- 非最大序列行直接设为NA;
- 匹配成功的行,根据
organ_placed的值生成对应Single标签; - 匹配失败的行,结合捐赠者已成功的器官类型,反向推断丢弃的是另一侧肺,生成对应
Discarded标签。
内容的提问来源于stack exchange,提问作者John Ryan
相关产品推荐
相关产品推荐

