R中映射非数值分期因子 取两列分期字段较高值的实现方法
R实现肿瘤分期跨列取最高值方案
核心思路
先给所有分期定义优先级权重,把缺失值、未知值统一标准化后,逐行对比两列的权重值,取权重最高的对应分期即可。
实现步骤
第一步:定义分期优先级映射
按规则要求,有效值优先级高于Unknown,数值越大优先级越高:
# 优先级从低到高排序,Unknown权重最低,仅当两列都为Unknown/缺失时输出 stage_levels <- c("Unknown", "I", "IA", "IB", "II", "IIA", "IIB", "III", "IIIA", "IIIB", "IIIC", "IV", "IVA", "IVB", "IVC") # 生成权重映射表 stage_weight <- setNames(seq_along(stage_levels), stage_levels)
第二步:标准化原始数据的分期值
把原始两列里的NA、Unknown/Not Reported都统一替换为Unknown,避免后续匹配出错:
library(dplyr) df_clean <- df %>% mutate(across(c(PathGroupStage, ClinGroupStage), ~case_when( is.na(.) | . == "Unknown/Not Reported" ~ "Unknown", TRUE ~ . )))
第三步:逐行取最高分期生成OutputStage
每行分别获取两列的权重,取权重更大的对应的分期即可:
df_result <- df_clean %>% rowwise() %>% mutate( path_w = stage_weight[PathGroupStage], clin_w = stage_weight[ClinGroupStage], OutputStage = stage_levels[max(path_w, clin_w)] ) %>% ungroup() %>% # 可选:删除中间计算的权重列 select(-path_w, -clin_w)
结果验证
运行后生成的结果完全匹配要求:
- 第2行I和IA对比,输出IA
- 第5行I和III对比,输出III
- 第7行IIIA和IIB对比,输出IIIA
- 第9行两列都缺失,输出Unknown
基础R简化实现
不想依赖dplyr可以用基础R实现:
# 先标准化所有值 df[is.na(df)] <- "Unknown" df[df == "Unknown/Not Reported"] <- "Unknown" # 逐行计算结果 df$OutputStage <- apply(df, 1, function(x) { w1 <- stage_weight[x[1]] w2 <- stage_weight[x[2]] stage_levels[max(w1, w2)] })
内容的提问来源于stack exchange,提问作者sutsabs
相关产品推荐
相关产品推荐

