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

求助:SAS实现跨行统计指定ICD关键词出现次数

问题分析与解决方案

原代码存在的核心问题

  1. leave语句错误:该语句会在找到第一个匹配的ICD编码后直接终止循环,无法统计所有符合条件的就医次数。
  2. 计数逻辑混乱:count(whichc(...))的用法完全错误,whichc仅返回匹配的位置索引,此处只需判断编码是否存在匹配即可,无需额外计数。
  3. 关键词扩展性差:固定长度的数组c无法高效维护大量ICD编码,修改或新增关键词时需频繁改动代码。

最优解决方案(哈希表+动态列匹配)

针对大量关键词的场景,推荐用哈希表存储ICD编码,配合SAS的动态列匹配功能实现高效统计:

步骤1:创建酒精相关ICD编码数据集(方便批量维护)

data icd_codes;
    length code $4;
    input code;
    datalines;
X45
Y15
X65
/* 在此处继续添加所有需要统计的酒精相关ICD编码 */
;
run;

步骤2:统计符合条件的就医次数

data home.new2;
    set home.new;
    /* 动态匹配所有以D_I10_开头的列 */
    array d1 D_I10_:;
    visits = 0;

    /* 仅初始化一次哈希表,加载ICD编码数据集 */
    if _n_ = 1 then do;
        declare hash h(dataset:'icd_codes');
        h.defineKey('code');
        h.defineData('code');
        h.defineDone();
        call missing(code);
    end;

    /* 遍历所有D_I10_列,统计匹配次数 */
    do i = 1 to dim(d1);
        code = d1[i];
        /* 若当前编码在哈希表中存在,计数+1 */
        if h.find() = 0 then visits + 1;
    end;

    drop i code; /* 清理临时变量 */
run;

简化方案(宏变量批量关键词)

如果关键词数量未超出宏变量长度限制,也可以直接用宏变量实现:

/* 批量定义所有酒精相关ICD编码 */
%let icd_list = X45 Y15 X65;

data home.new2;
    set home.new;
    array d1 D_I10_:;
    visits = 0;

    do i = 1 to dim(d1);
        /* 检查当前编码是否在关键词列表中 */
        if whichw(d1[i], &icd_list.) > 0 then visits + 1;
    end;

    drop i;
run;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 15:35:25