SAS格式表匹配ICD码:如何设置Other参数避免返回原ICD值?
解决SAS中未匹配ICD码返回空值的问题
针对你遇到的使用CNTLIN生成字符格式后,未匹配的ICD码会返回自身值的问题,这里有两种高效的解决方案,完全不需要手动编写数百条VALUE语句:
方法1:在格式定义中添加OTHERS规则(推荐)
这种方法从格式本身入手,让未匹配的所有值统一返回空值,后续任何使用该格式的地方都会自动生效,适合长期复用。
修改步骤:
- 在生成格式数据集时,明确指定格式类型为字符型(
TYPE='C'),避免SAS默认识别错误; - 追加一条
OTHER记录,定义未匹配时的返回值为空字符串。
完整代码:
/* 从CSV表生成基础格式数据集,重命名列并指定格式属性 */ DATA FORMAT; SET FORMAT_TABLE(RENAME = (ICD_CODE = START CANCER_TYPE = LABEL)); RETAIN FMTNAME '$CANCER_TYPE' TYPE 'C'; /* TYPE='C'明确标记为字符格式 */ RUN; /* 添加OTHERS规则:未匹配的ICD码返回空值 */ DATA FORMAT_FINAL; SET FORMAT; OUTPUT; /* 输出原有所有ICD-癌症映射关系 */ /* 仅在第一条记录后插入OTHER规则,避免重复生成 */ IF _N_ = 1 THEN DO; START = 'OTHER'; LABEL = ''; /* 空字符串,也可根据需求改为'未匹配'等自定义内容 */ OUTPUT; END; RUN; /* 生成永久格式(LIB=LIBRARY可根据你的实际库名调整) */ PROC FORMAT LIB = LIBRARY CNTLIN = FORMAT_FINAL; RUN; /* 应用格式生成CANCER列 */ DATA LOOKUP_DATA; SET DATA; CANCER = PUT(ICD, $CANCER_TYPE.); RUN;
方法2:数据步中直接判断并替换未匹配值
如果不想修改已有的格式定义,可以在执行PUT函数后,直接判断结果是否与原ICD值一致——若一致则说明未匹配到,将其替换为空值。
代码示例:
/* 保留你原来的格式生成代码不变 */ DATA FORMAT; SET FORMAT_TABLE(RENAME = (ICD_CODE = START CANCER_TYPE = LABEL)); RETAIN FMTNAME '$CANCER_TYPE'; RUN; PROC FORMAT LIB = LIBRARY CNTLIN = CAL.FMT; RUN; /* 应用格式后处理未匹配值 */ DATA LOOKUP_DATA; SET DATA; CANCER = PUT(ICD, $CANCER_TYPE.); /* 未匹配时PUT会返回原ICD值,直接替换为空 */ IF CANCER = ICD THEN CANCER = ''; RUN;
两种方法对比:
- 方法1更高效,一次定义后所有场景通用,适合有大量重复查询的需求;
- 方法2更灵活,适合临时处理,不需要调整已有的格式定义。
内容的提问来源于stack exchange,提问作者Qimeng Zhang
相关产品推荐
相关产品推荐

