如何用SAS实现多条件下的频次统计?附示例数据集
用SAS实现指定医疗数据统计逻辑
示例数据集
| ID | GET_DRUG | HOSP | DATE | QTY |
|---|---|---|---|---|
| A | H111 | H111 | 2021/12/31 | 3 |
| A | H112 | H112 | 2022/1/10 | 4 |
| A | H110 | H110 | 2022/1/13 | 5 |
| A | D110 | H110 | 2022/1/14 | 6 |
| A | D111 | H110 | 2022/1/16 | 3 |
| A | H112 | H112 | 2022/1/23 | 4 |
| A | D113 | H110 | 2022/1/30 | 5 |
| A | D114 | H110 | 2022/2/13 | 5 |
统计需求
- 步骤1:筛选
GET_DRUG首字符为"D"的行,计算这些行与同一ID下所有更早行的日期差,仅保留日期差≤15天的记录 - 步骤2:按每个D类行分组,统计对应符合条件的更早行中去重后的
HOSP数量(HOSP_NUM)和QTY的总和(QTY_SUM) - 步骤3:统计满足
HOSP_NUM≥2且QTY_SUM≥10的分组频次,预期结果为2,对应两组日期区间:"2021/12/312022/1/13"和"2022/1/102022/1/14"
SAS实现代码
1. 创建/导入原始数据集
如果是示例数据,可直接用DATA步创建;如果是现有大数据集,直接引用对应SAS库中的数据集即可:
/* 创建示例数据集(若为现有数据集可跳过此步,直接使用已有数据集名) */ data raw_data; input ID $ GET_DRUG $ HOSP $ DATE :yymmdd10. QTY; format DATE yymmdd10.; datalines; A H111 H111 2021-12-31 3 A H112 H112 2022-01-10 4 A H110 H110 2022-01-13 5 A D110 H110 2022-01-14 6 A D111 H110 2022-01-16 3 A H112 H112 2022-01-23 4 A D113 H110 2022-01-30 5 A D114 H110 2022-02-13 5 ; run;
2. 执行步骤1:筛选D类行并计算日期差
通过自连接关联同一ID下更早的行,筛选符合日期差条件的记录:
proc sql; create table step1 as select a.ID, a.GET_DRUG as D_GET_DRUG, a.DATE as D_DATE, b.GET_DRUG as ABOVE_GET_DRUG, b.HOSP as ABOVE_HOSP, b.DATE as ABOVE_DATE, b.QTY as ABOVE_QTY, intck('day', b.DATE, a.DATE) as DATE_DIFFERENCE from raw_data a left join raw_data b on a.ID = b.ID and b.DATE < a.DATE where substr(a.GET_DRUG, 1, 1) = 'D' and calculated DATE_DIFFERENCE <= 15; quit;
3. 执行步骤2:统计HOSP去重数和QTY总和
按每个D类行的日期分组,统计对应更早行的指标,同时生成日期区间:
proc sql; create table step2 as select cat(put(min(ABOVE_DATE), yymmdd10.), '~', put(max(ABOVE_DATE), yymmdd10.)) as DATE_RANGE, count(distinct ABOVE_HOSP) as HOSP_NUM, sum(ABOVE_QTY) as QTY_SUM from step1 group by D_DATE; quit;
4. 执行步骤3:统计符合条件的频次
直接筛选满足条件的分组并计数:
proc sql; select count(*) as FINAL_COUNT label='符合条件的组合频次' from step2 where HOSP_NUM >= 2 and QTY_SUM >= 10; quit;
运行上述代码后,FINAL_COUNT的结果为2,与预期一致。
内容的提问来源于stack exchange,提问作者user20407645
相关产品推荐
相关产品推荐

