如何在R语言中基于OR条件创建含多水平的新变量txtype
我来帮你解决这个多水平治疗类型变量的创建问题!你现在已经能实现单一水平的逻辑变量,接下来只需要把这些判断逻辑整合起来,生成包含typeA到typeG的分类变量就行。下面给你几种常用的实现方法,按需选择:
方法1:用dplyr的case_when()(推荐,代码可读性高)
如果你习惯用tidyverse工具链,case_when()是最直观的方式,它能按顺序匹配条件并赋值,代码结构清晰,尤其适合多水平的场景:
# 先加载dplyr包(未安装的话先运行install.packages("dplyr")) library(dplyr) # 创建txtype变量 data <- data %>% mutate(txtype = case_when( NDC %in% c("11111", "22222", "33333") ~ "typeA", NDC %in% c("44444", "55555") ~ "typeB", NDC %in% c("66666", "77777", "88888", "99999") ~ "typeC", # 继续添加typeD到typeG的对应NDC组 NDC %in% c("00001", "00002") ~ "typeD", NDC %in% c("00003") ~ "typeE", NDC %in% c("00004", "00005", "00006") ~ "typeF", NDC %in% c("00007", "00008") ~ "typeG", # 处理不匹配任何组的NDC,可设为"Other"或NA TRUE ~ "Other" )) # 可选:将txtype转为因子变量,方便后续统计分析 data$txtype <- as.factor(data$txtype)
方法2:Base R嵌套ifelse()(无需额外包)
如果不想加载第三方包,用Base R的ifelse()嵌套也能实现,只是代码会稍长一些:
data$txtype <- ifelse(data$NDC %in% c("11111", "22222", "33333"), "typeA", ifelse(data$NDC %in% c("44444", "55555"), "typeB", ifelse(data$NDC %in% c("66666", "77777", "88888", "99999"), "typeC", ifelse(data$NDC %in% c("00001", "00002"), "typeD", ifelse(data$NDC %in% c("00003"), "typeE", ifelse(data$NDC %in% c("00004", "00005", "00006"), "typeF", ifelse(data$NDC %in% c("00007", "00008"), "typeG", "Other"))))))) # 同样可选转为因子,指定水平顺序更规范 data$txtype <- factor(data$txtype, levels = c("typeA", "typeB", "typeC", "typeD", "typeE", "typeF", "typeG", "Other"))
方法3:映射表+match()(适合大量NDC组的情况)
如果你的NDC分组很多,维护独立的映射表会更方便,后续修改分组只需要更新映射表即可:
# 创建映射表:第一列是NDC,第二列是对应的治疗类型 ndc_map <- data.frame( NDC = c("11111", "22222", "33333", "44444", "55555", "66666", "77777", "88888", "99999", "00001", "00002", "00003", "00004", "00005", "00006", "00007", "00008"), txtype = rep(c("typeA", "typeB", "typeC", "typeD", "typeE", "typeF", "typeG"), times = c(3,2,4,2,1,3,2)) ) # 用match匹配NDC对应的type,再处理不匹配的情况 data$txtype <- ndc_map$txtype[match(data$NDC, ndc_map$NDC)] data$txtype[is.na(data$txtype)] <- "Other" # 转为因子 data$txtype <- factor(data$txtype, levels = c("typeA", "typeB", "typeC", "typeD", "typeE", "typeF", "typeG", "Other"))
注意事项:
- 确保每个NDC只对应一个治疗类型,避免条件重叠(如果有重叠,
case_when()和ifelse()会按顺序取第一个匹配的结果) - 如果不需要"Other"类别,可以把默认情况设为
NA
内容的提问来源于stack exchange,提问作者sh2
相关产品推荐
相关产品推荐

