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

如何从R语言DataFrame宽格式数据生成药物类别指示变量?

R语言生成药物类别指示变量的解决方案

需求说明

现有宽格式DataFrame,记录受试者多次访视的药物服用数据(DRUG1-DRUG3),需生成三个指示变量:

  • CLASS1:该访视是否服用A/B/C类药物(是=1,否=0)
  • CLASS2:该访视是否服用D/E/F类药物(是=1,否=0)
  • CLASS3:该访视是否服用G/H/I类药物(是=1,否=0)

示例数据:

ID <- c(1,1,2,2,3,3,4,4,4)
Visit <- c(1,2,1,2,1,2,1,2,3)
DRUG1 <- c("A","A","A","A","G","G","D","D","G")
DRUG2 <- c("A","G","B","B","G","G","D","D","G")
DRUG3 <- c("A","G","B","B","G","G","D","D","G")
df <- data.frame(ID, Visit, DRUG1, DRUG2, DRUG3)

期望输出的指示变量:

  • CLASS1: (1,1,1,1,0,0,0,0,0)
  • CLASS2: (0,0,0,0,0,0,1,1,0)
  • CLASS3: (0,1,0,0,1,1,0,0,1)

方法一:Base R实现(无需额外包)

先定义药物分类映射,再逐行检查是否包含对应类别药物:

# 定义药物分类
drug_classes <- list(
  CLASS1 = c("A", "B", "C"),
  CLASS2 = c("D", "E", "F"),
  CLASS3 = c("G", "H", "I")
)

# 生成指示变量
df$CLASS1 <- apply(df[, grep("DRUG", colnames(df))], 1, function(x) any(x %in% drug_classes$CLASS1) + 0)
df$CLASS2 <- apply(df[, grep("DRUG", colnames(df))], 1, function(x) any(x %in% drug_classes$CLASS2) + 0)
df$CLASS3 <- apply(df[, grep("DRUG", colnames(df))], 1, function(x) any(x %in% drug_classes$CLASS3) + 0)

方法二:Tidyverse实现(dplyr)

利用rowwise()和c_across()逐行处理,代码更简洁:

library(dplyr)

df <- df %>%
  rowwise() %>%
  mutate(
    CLASS1 = +any(c_across(starts_with("DRUG")) %in% c("A", "B", "C")),
    CLASS2 = +any(c_across(starts_with("DRUG")) %in% c("D", "E", "F")),
    CLASS3 = +any(c_across(starts_with("DRUG")) %in% c("G", "H", "I"))
  ) %>%
  ungroup()

验证结果

运行上述代码后,查看df的CLASS1-CLASS3列,即可得到符合预期的指示变量。

内容的提问来源于stack exchange,提问作者Jenn0804

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 12:50:08