从SAS转R:多变量循环按字符位置赋值total_drug问题
SAS转R:实现诊断码匹配逻辑的正确循环方法
原SAS代码逻辑
data Drug_inj; set initial; array odiag(25) odiag1-odiag25; do i = 1 to 25; if substrn(odiag(i), 1,3) = 'T36' and (substrn(odiag(i), 6,1) = '1') then total_drug = 1; if substrn(odiag(i), 1,3) = 'T37' and (substrn(odiag(i), 6,1) = '1') then total_drug = 1; if substrn(odiag(i), 1,3) = 'T38' and (substrn(odiag(i), 6,1) = '1') then total_drug = 1; if substrn(odiag(i), 1,3) = 'T39' and (substrn(odiag(i), 6,1) = '1') then total_drug = 1; if substrn(odiag(i), 1,2) = 'T4' and (substrn(odiag(i), 6,1) = '1') then total_drug = 1; if substrn(odiag(i), 1,3) = 'T50' and (substrn(odiag(i), 6,1) = '1') then total_drug = 1; if substrn(odiag(i), 1,4) = 'T369' then total_drug = 1; end;
需求说明
遍历odiag1至odiag25变量,只要任意一个变量满足以下条件之一,就将total_drug赋值为1:
- 字符串前3位为
T36/T37/T38/T39/T50且第6位为1 - 字符串前2位为
T4且第6位为1 - 字符串前4位为
T369
原尝试代码的错误点
- 变量列表定义错误:需用字符向量而非列表,且元素间需用逗号分隔
- 循环语法错误:正确格式应为
for (var in 变量向量) substr参数错误:将判断条件误写进了截取长度参数中,需先截取字符串再做判断- 列引用错误:
Drug_inj$i会取列名为i的变量,需用Drug_inj[[var]]引用循环中的目标列 ifelse逻辑混乱:多个条件未正确用逻辑运算符组合
正确的循环实现代码
# 初始化total_drug为0(默认不满足条件) Drug_inj$total_drug <- 0 # 自动生成odiag1到odiag25的变量名向量 odiag_vars <- paste0("odiag", 1:25) # 循环遍历每个诊断码变量 for (var in odiag_vars) { # 提取当前循环的诊断码列 current_diag <- Drug_inj[[var]] # 拆分三个判断条件 cond1 <- substr(current_diag, 1, 3) %in% c("T36", "T37", "T38", "T39", "T50") & substr(current_diag, 6, 6) == "1" cond2 <- substr(current_diag, 1, 2) == "T4" & substr(current_diag, 6, 6) == "1" cond3 <- substr(current_diag, 1, 4) == "T369" # 只要任一条件成立,将对应行的total_drug设为1 Drug_inj$total_drug[cond1 | cond2 | cond3] <- 1 }
代码说明
- 用
paste0自动生成变量名,避免手动输入25个变量名的繁琐 - 先初始化
total_drug为0,确保未满足条件的行默认值正确 - 拆分条件后用
|(逻辑或)组合,符合SAS中多次判断只要任一条件触发就赋值1的逻辑 - 循环中只要某一行的任意一个odiag变量满足条件,就将该行
total_drug设为1,后续循环不会覆盖已赋值的1
内容的提问来源于stack exchange,提问作者kevin_kwan
相关产品推荐
相关产品推荐

