如何在SAS Enterprise Guide中按列聚合各值的出现次数?
在SAS Enterprise Guide/PROC SQL中实现列值频次的宽表聚合
方法一:PROC SQL直接计算(适合已知目标值)
通过CASE语句逐个统计指定值的出现次数,一步生成目标数据集:
/* 替换HAVE为你的实际原数据集名称 */ PROC SQL; CREATE TABLE WANT AS SELECT SUM(CASE WHEN COL2 = 'A' THEN 1 ELSE 0 END) AS COL2_A, SUM(CASE WHEN COL2 = 'B' THEN 1 ELSE 0 END) AS COL2_B, SUM(CASE WHEN COL3 = 'C' THEN 1 ELSE 0 END) AS COL3_C, SUM(CASE WHEN COL3 = 'D' THEN 1 ELSE 0 END) AS COL3_D FROM HAVE; QUIT;
说明
CASE语句判断每行是否匹配目标值,匹配记1、不匹配记0,通过SUM累加得到总出现次数- 生成的
WANT数据集即为你需要的一行四列的统计结果
方法二:PROC FREQ+转置(适合值较多或不确定的场景)
如果COL2/COL3中的取值较多或无法提前确定,可通过频次统计+转置的方式自动生成统计列:
/* 1. 统计COL2的频次,仅输出数据集不生成报表 */ PROC FREQ DATA=HAVE NOPRINT; TABLE COL2 / OUT=FREQ_COL2(RENAME=(COUNT=COL2_COUNT) DROP=PERCENT); RUN; /* 2. 将COL2的频次长表转成宽表,自动添加COL2_前缀 */ PROC TRANSPOSE DATA=FREQ_COL2 OUT=WIDE_COL2 PREFIX=COL2_; ID COL2; VAR COL2_COUNT; RUN; /* 3. 统计COL3的频次 */ PROC FREQ DATA=HAVE NOPRINT; TABLE COL3 / OUT=FREQ_COL3(RENAME=(COUNT=COL3_COUNT) DROP=PERCENT); RUN; /* 4. 将COL3的频次长表转成宽表,自动添加COL3_前缀 */ PROC TRANSPOSE DATA=FREQ_COL3 OUT=WIDE_COL3 PREFIX=COL3_; ID COL3; VAR COL3_COUNT; RUN; /* 5. 合并两个宽表得到最终结果 */ DATA WANT; MERGE WIDE_COL2 WIDE_COL3; RUN;
说明
PROC FREQ的OUT参数输出频次统计结果,NOPRINT参数避免生成冗余报表PROC TRANSPOSE将按值分组的长表转换为横向排列的宽表,PREFIX参数统一为列名添加前缀- 最后通过
MERGE合并两个宽表,得到包含所有统计列的数据集
SAS Enterprise Guide操作提示
在EG中可选择两种操作方式:
- 直接打开程序编辑器,粘贴上述代码并替换数据集名后运行
- 通过拖拽任务实现:依次添加「频率」「转置」「合并数据集」任务,按代码逻辑配置对应参数
内容的提问来源于stack exchange,提问作者dingaro
相关产品推荐
相关产品推荐

