如何用SAS ARRAY、DO循环及计数器统计指定范围诊断数并保留全量观测?
解决SAS中统计指定范围诊断值数量并保留全量观测的问题
需求说明
统计每个患者ID在7-9范围内的诊断值数量,用newvar变量记录该数量,要求保留所有观测(即使无符合条件的诊断值)。
示例输入数据
data 1; input id r1-r5; datalines; 1 8 4 5 6 3 2 4 8 7 2 1 3 1 3 5 9 4 4 2 3 3 6 5 ;
期望输出数据
data 2; input id r1-r5 newvar; datalines; 1 8 4 5 6 3 1 2 4 8 7 2 1 2 3 1 3 5 9 4 1 4 2 3 3 6 5 0 etc..
原代码问题分析
原代码把output语句放在了if 6<rx(i)<10的条件块内,导致:
- 只有当诊断值符合范围时才输出观测,无符合条件的ID(如ID4)直接丢失
- 每遇到一个符合条件的诊断值就输出一次,导致有多个符合值的ID(如ID2)生成多行重复观测
正确实现代码
DATA 2 (drop=i); set 1; array rx r1-r5; /* 定义数组覆盖r1到r5的5个变量,无需指定多余长度 */ newvar = 0; /* 初始化计数变量为0 */ do i = 1 to dim(rx); /* 用dim(rx)动态获取数组长度,避免硬编码5 */ if rx(i) between 7 and 9 then newvar + 1; /* 符合范围则计数+1 */ end; output; /* 循环结束后统一输出当前观测,确保每个ID只输出一行 */ RUN;
代码说明
- 数组定义:用
array rx r1-r5直接关联目标变量,或者array rx(5) r1-r5,避免原代码中(10)的冗余定义;用dim(rx)获取数组长度,比硬编码5更灵活 - 计数逻辑:在do循环内仅完成符合条件值的计数,不执行输出操作
- 统一输出:将
output放在do循环外,确保每个观测无论是否有符合条件的诊断值,都会被输出一次;无符合条件时newvar保持初始值0
内容的提问来源于stack exchange,提问作者doodledad
相关产品推荐
相关产品推荐

