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

在SAS中用DATA步而非PROC步统计行内分类变量及去重统计诊断数

当然可以用DATA步实现这两个需求!我给你一步步拆解,附上可直接运行的代码示例:

1. 用DATA步给每行添加分类变量的全局计数(COUNT字段)

如果你的需求是给原数据的每一行都加上对应分类在整个数据集里的出现次数(方便后续用COUNT=1/COUNT>1筛选),可以分两步走:先统计每个分类的总次数,再把这个次数合并回原数据。

假设你的原始数据集叫raw_data,包含字段patient_id(患者ID)和diag(诊断分类,比如AA、CB),代码如下:

/* 第一步:统计每个诊断分类的总出现次数 */
proc sort data=raw_data;
    by diag;
run;

data diag_counts;
    set raw_data;
    by diag;
    if first.diag then count_total = 0;
    count_total + 1;
    if last.diag then output;
    keep diag count_total;
run;

/* 第二步:把计数合并回原始数据集,给每行加上对应的count字段 */
data raw_data_with_count;
    merge raw_data diag_counts;
    by diag;
run;

这样处理后,raw_data_with_count里的每一行都会有一个count_total字段,代表该诊断在全数据集的总出现次数,你就可以用where count_total=1;或者if count_total>1 then ...来做后续分析了。

2. 按患者统计各诊断数量(自动去除重复记录)

如果你的需求是先按患者+诊断去重,再统计每个诊断的总数量(比如你举的例子:3条CB里有1条是患者2的重复,去重后CB实际是2条),同样可以用DATA步完成:

/* 第一步:先按患者+诊断排序,去除重复记录 */
proc sort data=raw_data nodupkey;
    by patient_id diag;
run;

/* 第二步:用DATA步统计去重后每个诊断的总数量 */
data final_diag_counts;
    set raw_data;  /* 这里用的是去重后的数据集 */
    by diag;
    if first.diag then patient_count = 0;
    patient_count + 1;
    if last.diag then output;
    keep diag patient_count;
run;

这里的patient_count就是去重后每个诊断对应的患者数量(也就是你说的“CB实际应统计为2条”的结果)。如果你的需求是每个患者的每个诊断出现次数(去重后),那可以调整为按patient_id diag分组计数:

data patient_diag_counts;
    set raw_data;
    by patient_id diag;
    if first.diag then diag_per_patient = 1;
    else diag_per_patient = 1;  /* 去重后每个患者每个诊断只算1次 */
    if last.diag then output;
    keep patient_id diag diag_per_patient;
run;

注:SAS中BY组处理依赖排序后的数据集,所以PROC SORT是这类操作的必要前置步骤,这也是最简洁高效的实现方式。

祝你SAS分析顺利,也祝你新年快乐!

内容的提问来源于stack exchange,提问作者curious14

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:47:09