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

SAS EG技术问询:如何从数据集排除糖尿病患者

问题分析与解决方案

你的当前代码只是完成了三个数据集按edipn的合并,但没有添加筛选逻辑来排除糖尿病患者,所以达不到预期效果。咱们来一步步修正:

方法一:用DATA步MERGE实现

核心思路是利用IN=选项标记每个来源数据集的记录,然后通过条件筛选保留符合要求的对象:

data excdiab;
  /* 用IN=标记每个数据集的来源 */
  merge diabexc (IN=a)  /* a=1表示这条记录来自排除列表diabexc */
        clmspull (IN=b) /* b=1表示来自clmspull */
        enroll (IN=c);  /* c=1表示来自enroll */
  by edipn;
  /* 筛选规则:来自业务表(clmspull/enroll) 且 不在排除列表中 */
  if (b or c) and not a;
run;

关键说明:

  • IN=a是给diabexc的记录打标记,当合并时某条记录来自diabexc,a变量的值为1,否则为0;b和c同理。
  • (b or c)确保我们只保留来自业务数据的记录,避免把diabexc里的排除对象也放进结果;and not a则直接排除掉在糖尿病患者列表里的人员。

方法二:用PROC SQL实现(逻辑更直观)

如果对SQL语法更熟悉,这种方式可能更容易理解,尤其适合处理多表合并+筛选的场景:

proc sql;
  create table excdiab as
  select *
  from (
    /* 先合并clmspull和enroll的所有记录,union all保留重复(如果不需要重复用union) */
    select * from clmspull
    union all
    select * from enroll
  ) as combined_data
  /* 排除掉diabexc列表中的edipn */
  where edipn not in (select edipn from diabexc);
quit;

注意事项:

  1. 确保三个数据集的edipn变量类型、长度、格式完全一致,否则会出现匹配失败的情况(比如字符型和数值型的edipn无法正确关联)。
  2. 如果clmspull和enroll有同名变量,DATA步MERGE时会用后一个数据集(enroll)的变量值覆盖前一个(clmspull)的,若需要保留两边的变量,记得用RENAME=选项重命名,比如clmspull (IN=b rename=(visit_date=clm_visit_date))。
  3. 如果diabexc里存在重复的edipn,两种方法都能正确处理,只要该ID出现在排除列表中就会被过滤。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:55:57