如何在SAS中提取数值型变量的最后两位数字?
解决SAS中提取数值变量最后两位的问题
嗨,我来帮你搞定这个问题!你遇到的麻烦主要有两个点:一是substr确实只支持字符型变量,二是你之前写的substr参数逻辑不对,取的是前几位而非最后两位。下面给你两种实用的解决方案,按需选就行:
方法一:数学运算(推荐,无需转字符)
对于数值型变量,直接用取模函数mod()就能轻松拿到最后两位,完全不用折腾字符转换,代码简洁还不容易出错:
data want; set have; var2 = mod(var1, 100); /* 取var1除以100的余数,就是最后两位数值 */ /* 如果需要显示为两位数字(比如把0显示成00),可以加格式修饰 */ format var2 z2.; run;
用你的示例测试结果:
- 1234 → 34
- 237 → 37
- 754 → 54
- 9000 → 0(数值型存储就是0,加上
z2.格式后会显示为00)
方法二:字符转换修正版
如果你一定要用字符处理的方式,得修正substr的参数,同时注意数值转字符时的格式问题(避免前导空格或位数不足):
/* 方式A:用负索引直接取最后两位 */ data want; set have; /* 先转字符,trim去掉多余空格,substr(-2)表示从倒数第2位开始取到末尾 */ var2 = input(substr(trim(put(var1, 8.)), -2), 8.); format var2 z2.; run; /* 方式B:用固定长度的z格式补前导零,再取最后两位 */ data want; set have; /* z4.表示转成4位字符,不足补前导零,比如237会变成'0237' */ var_char = put(var1, z4.); var2 = input(substr(var_char, 3, 2), 8.); /* 取第3到4位,也就是最后两位 */ format var2 z2.; run;
为什么你之前的代码不对?
你写的substr(put(var1), 1, length(put(var1))-1)是取从第1位开始、长度为总长度减1的字符,比如1234会取到123,完全不是你要的最后两位。另外,直接用put(var1)会用默认数值格式,可能导致位数显示异常(比如大数值用科学计数法),所以最好指定明确的格式(比如8.或z4.)。
内容的提问来源于stack exchange,提问作者Rods2292
相关产品推荐
相关产品推荐

