如何用Proc Freq对同一ID下的两次occurrence生成交叉表?
解决方案
要生成你需要的occurrence组合交叉表,核心是先把每个ID对应的两个occurrence整合到同一行的两个变量中,再基于这两个变量统计组合频次。具体步骤如下:
1. 将长格式数据集转换为宽格式
原数据集是每个ID占两行的长格式,先通过排序+转置,生成每个ID一行、包含两个occurrence变量的宽格式:
/* 按ID排序,确保同一ID的观测连续 */ proc sort data=have; by id; run; /* 转宽格式,生成occ1、occ2两个变量,分别存储每个ID的两个occurrence */ proc transpose data=have out=have_wide prefix=occ; by id; var occurrence; run;
2. 统计occurrence组合的频次
基于宽格式的两个变量,用proc freq统计组合频次并输出到临时数据集:
proc freq data=have_wide noprint; /* 统计occ1与occ2的交叉频次,仅保留计数结果 */ tables occ1*occ2 / out=cross_freq (drop=percent); run;
3. 转换为目标表格样式
将频次结果转成你需要的行列格式,同时把缺失的频次填充为0:
/* 转宽为目标样式,missing选项确保所有occurrence类别都显示 */ proc transpose data=cross_freq out=final_table prefix=occ missing; id occ2; var count; run; /* 替换缺失值为0,修正列名标签 */ data final_table; set final_table; array occ[*] occ:; do over occ; if occ=. then occ=0; end; rename occ1='Frequency'; run; /* 打印最终表格 */ proc print data=final_table noobs label; label occ1='Frequency'; run;
原代码无效的原因
- 直接执行
proc freq data=have; tables occurrence*occurrence;会统计所有观测的随机两两组合,而非按ID配对的组合,结果完全不符合需求。 - 使用
by id会为每个ID单独生成交叉表,无法汇总所有ID的组合频次。
内容的提问来源于stack exchange,提问作者doodledad
相关产品推荐
相关产品推荐

