You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 00:01:22