如何从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
相关产品推荐
相关产品推荐

