R语言行记录筛选场景下多if/else if条件编写及超期标记实现
现有代码的问题点
- R中默认的
if判断仅支持标量运算,直接传入整列向量作为判断条件时,只会取第一行的计算结果应用到全量数据,无法实现逐行判断的需求 - 代码存在拼写错误:第二个判断分支误将目标数据集写为
sv_domain,运行时会直接报对象不存在的错误 - 语法不完整:代码末尾缺少闭合的大括号,且未定义未超出窗口期时
Flag的默认取值 - 逻辑冗余:同一访视的上下限超出判断可以合并,无需拆分为两个独立分支
解决方案
基础R实现方案
# 先初始化Flag默认值为"N",代表未超出窗口期 data$Flag <- "N" # 对超出窗口期的记录标记为"Y" data$Flag[data$VISIT == "Screening" & data$STDTY >= -1] <- "Y" data$Flag[data$VISIT == "Day 1" & data$STDTY != 1] <- "Y" data$Flag[data$VISIT == "Week 2" & (data$STDTY < 9 | data$STDTY > 21)] <- "Y" # 后续其他访视按相同规则补充即可,例如Week 4的合规区间为23 ≤ STDTY ≤35,对应写法: # data$Flag[data$VISIT == "Week 4" & (data$STDTY < 23 | data$STDTY > 35)] <- "Y"
更易维护的dplyr实现方案
如果访视类型较多,推荐用dplyr包的case_when函数管理判断逻辑,可读性更强:
library(dplyr) data <- data %>% mutate(Flag = case_when( VISIT == "Screening" & STDTY >= -1 ~ "Y", VISIT == "Day 1" & STDTY != 1 ~ "Y", VISIT == "Week 2" & (STDTY < 9 | STDTY > 21) ~ "Y", # 在此处补充其他访视的判断规则 .default = "N" ))
如果访视周次较多,还可以直接从VISIT字段提取周数自动计算合规区间,无需逐个硬编码:
data <- data %>% mutate( # 提取周数字段,非周次访视返回NA visit_week = as.integer(sub("Week (\\d+)", "\\1", VISIT)), base_day = visit_week *7 +1, lower = base_day -6, upper = base_day +6, Flag = case_when( VISIT == "Screening" & STDTY >= -1 ~ "Y", VISIT == "Day 1" & STDTY != 1 ~ "Y", !is.na(visit_week) & (STDTY < lower | STDTY > upper) ~ "Y", .default = "N" ) ) %>% # 移除临时计算字段 select(-visit_week, -base_day, -lower, -upper)
内容的提问来源于stack exchange,提问作者Elif Y
相关产品推荐
相关产品推荐

