SAS自定义格式未生效:为何诊断码未正确映射为疾病名称?
SAS代码问题:格式化后未正确显示疾病描述
你的SAS代码如下:
data disease; input diagcode$; datalines; 350 290 800 ; run; proc format; value $codetwo '350' = 'Malaria' '290' = 'Social Anxiety Disorder' '800' = 'Leg Injury' ; run; data diseasereal; set disease; diagdesc = put(diagcode, $codetwo.); run;
期望输出
| diagcode(诊断码) | diagcodedesc(诊断描述) |
|---|---|
| 350 | Malaria |
| 290 | Social Anxiety Disorder |
| 800 | Leg Injury |
实际输出
| diagcode(诊断码) | diagcodedesc(诊断描述) |
|---|---|
| 350 | 350 |
| 290 | 290 |
| 800 | 800 |
问题原因
核心问题是字符变量的空格匹配失败:
- 使用
input diagcode$;输入字符变量时,SAS默认会给该变量分配8个字符的长度,输入的诊断码(如350)会被存储为'350 '(尾部带5个空格)。 - 你在
proc format中定义的格式匹配的是无空格的字符串'350',两者无法匹配,因此put函数直接返回原变量值,导致输出仍是原诊断码。
另外,代码中生成的变量是diagdesc,但描述里写的是diagcodedesc,属于笔误,不影响核心问题,但需注意变量名一致性。
解决方法
有两种可靠的修复方式:
方式1:输入时指定变量长度
修改input语句,明确指定diagcode的长度为3(和诊断码的实际长度一致),避免存储多余空格:
data disease; input diagcode $3.; datalines; 350 290 800 ; run;
方式2:用trim函数去除变量空格后匹配格式
在put函数中先用trim函数去掉diagcode尾部的空格,再应用格式:
data diseasereal; set disease; diagdesc = put(trim(diagcode), $codetwo.); run;
两种方法都能让格式正确匹配,输出预期的疾病描述。
内容的提问来源于stack exchange,提问作者Sang Nguyen
相关产品推荐
相关产品推荐

