You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 07:48:43