如何在SAS Enterprise Guide或PROC SQL中按优先级聚合字符数据
SAS实现按ID优先级标记分组需求
问题说明
现有SAS表结构如下:
- ID:数值型
- GROUP:字符型,仅包含
PRI或CON两个取值
原始数据:
| ID | GROUP |
|---|---|
| 8945 | CON |
| 9567 | PRI |
| 9567 | PRI |
| 284 | CON |
| 284 | CON |
| 284 | PRI |
需要生成新字符列COL1,规则为:
- 若某ID存在
PRI组记录,无论CON出现多少次,COL1均为PRI - 若ID仅包含
CON记录,则COL1为CON(PRI优先级高于CON)
期望结果表:
| ID | COL1 |
|---|---|
| 8945 | CON |
| 9567 | PRI |
| 284 | PRI |
实现方法
方法一:PROC SQL实现
方式1:利用字符排序特性聚合
由于字符排序中PRI的ASCII值大于CON,使用MAX()函数直接取每个ID的最高优先级取值:
PROC SQL; CREATE TABLE result AS SELECT ID, MAX(GROUP) AS COL1 FROM original_table /* 替换为你的实际表名 */ GROUP BY ID; QUIT;
方式2:用CASE WHEN逻辑判断
通过子查询判断ID是否存在PRI记录,逻辑更直观:
PROC SQL; CREATE TABLE result AS SELECT ID, CASE WHEN EXISTS(SELECT 1 FROM original_table t2 WHERE t2.ID = t1.ID AND t2.GROUP = 'PRI') THEN 'PRI' ELSE 'CON' END AS COL1 FROM original_table t1 GROUP BY ID; QUIT;
方法二:常规SAS数据步实现
方式1:排序后取首条记录
先按ID排序,同一ID下让PRI排在最前面,再保留每个ID的第一条记录:
/* 排序:同一ID内PRI优先排在前面 */ PROC SORT DATA=original_table OUT=sorted_data; BY ID DESCENDING GROUP; RUN; /* 提取每个ID的第一条记录作为结果 */ DATA result; SET sorted_data; BY ID; IF FIRST.ID THEN DO; COL1 = GROUP; OUTPUT; END; KEEP ID COL1; RUN;
方式2:RETAIN保留优先级取值
通过RETAIN变量记录当前ID的最高优先级,最后输出每个ID的最终取值:
DATA result; SET original_table; BY ID; RETAIN COL1; /* 初始化当前ID的COL1 */ IF FIRST.ID THEN COL1 = GROUP; /* 若遇到PRI则更新为PRI */ ELSE IF GROUP = 'PRI' THEN COL1 = 'PRI'; /* 仅输出每个ID的最后一条记录 */ IF LAST.ID THEN OUTPUT; KEEP ID COL1; RUN;
内容的提问来源于stack exchange,提问作者dingaro
相关产品推荐
相关产品推荐

