SAS新手技术咨询:ICD-10码处理及Proc SQL队列创建问题
问题解决方案
一、ICD-10编码处理问题(去小数点、开头逗号、末尾字母丢失)
1. 核心问题排查
你当前代码存在3个关键错误:
- 读取CSV时未指定逗号分隔符,导致
ICD10_dcode读取异常(开头带逗号); - 字符变量长度未正确声明,导致编码末尾字母被截断;
compress函数调用时变量名写错,且length语句语法错误(未指定字符类型和长度)。
2. 修正代码
第一步:正确读取CSV文件
指定逗号分隔符,同时给ICD10_dcode设置足够的字符长度(ICD-10最长为7位,设为$10足够覆盖):
data EE2106; infile '/home/u62039685/DatasetEE2016/PUF_ICD10_DCODE2016.csv' dlm=',' dsd truncover; input inc_key :9. ICD10_dcode :$10.; run;
dlm=',':明确CSV的分隔符为逗号;dsd:处理带引号的字段,自动忽略字段内的逗号;truncover:避免行尾数据不足时截断变量;:修饰符:让SAS自动识别输入格式,避免固定长度读取导致的错误。
第二步:去除小数点并保留完整编码
修正length语句和compress函数的变量名,建议用新变量存储处理后的编码,避免覆盖原数据:
* 去除ICD10编码中的小数点; data EE2106final; set EE2106; length cleaned_icd10 $10.; cleaned_icd10 = compress(ICD10_dcode, '.'); run;
如果要直接修改原变量,需先声明长度再赋值:
data EE2106final; set EE2106; length ICD10_dcode $10.; ICD10_dcode = compress(ICD10_dcode, '.'); run;
二、用Proc SQL匹配300+ ICD-10编码创建研究队列
你的SQL代码连接条件错误,应使用ICD编码字段而非inc_key进行匹配,以下是两种可行方案:
1. 方案一:JOIN匹配(需统一编码格式)
先确保编码表和主表的ICD格式一致(都去除小数点):
* 预处理编码表,去除小数点; data icd10codes_clean; set icd10codes; diag_code_clean = compress(diag_code, '.'); run; * 执行匹配; proc sql; create table cohort as select a.* from cohort2016 a inner join icd10codes_clean b on compress(a.ICD10_dcode, '.') = b.diag_code_clean; quit;
2. 方案二:IN子句(更简洁)
直接用子查询筛选符合条件的样本,无需预处理编码表:
proc sql; create table cohort as select * from cohort2016 where compress(ICD10_dcode, '.') in (select compress(diag_code, '.') from icd10codes); quit;
- 如果编码存在大小写差异,可添加
upcase()函数统一格式,例如:upcase(compress(ICD10_dcode, '.'))。
内容的提问来源于stack exchange,提问作者ID0896
相关产品推荐
相关产品推荐

