求助:SAS实现跨行统计指定ICD关键词出现次数
问题分析与解决方案
原代码存在的核心问题
leave语句错误:该语句会在找到第一个匹配的ICD编码后直接终止循环,无法统计所有符合条件的就医次数。- 计数逻辑混乱:
count(whichc(...))的用法完全错误,whichc仅返回匹配的位置索引,此处只需判断编码是否存在匹配即可,无需额外计数。 - 关键词扩展性差:固定长度的数组
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
相关产品推荐
相关产品推荐

