SAS中字符型变量转数值型变量报INPUT函数无效参数如何解决
问题根因
运行input()转换报Invalid argument to function INPUT错误,是因为字符变量Dosis中存在无法被数值格式识别的内容:你贴出的样例值本身可被best12.格式正常读取,报错实际来自未展示的隐藏内容,常见为不可见控制字符、非半角数字/小数点的特殊符号、非标准空白(全角空格、不间断空格、制表符等)。
直接做乘1的隐式转换逻辑和input(Dosis, best.)完全一致,遇到非法字符同样会触发报错、生成缺失值,无法自动跳过异常内容。
可行解决方案
先对原始字符变量做清洗,仅保留数值转换需要的合法字符(数字、小数点,存在负数时额外保留负号),再执行转换,代码如下:
Data want; Set have; /* 清洗变量:仅保留数字、小数点,剔除所有可见/不可见非法字符 */ clean_dosis = compress(Dosis, '0123456789.', 'd'); /* 执行数值转换 */ Dosis_num = input(clean_dosis, best12.); /* 若你确实需要将样例中3333.4转为333.4,取消下一行注释即可,该需求大概率是样例笔误 */ * Dosis_num = Dosis_num / 10; /* 统一显示为1位小数,匹配你期望的输出样式 */ format Dosis_num 12.1; drop clean_dosis; run;
转换效果验证
对你给出的合法样例值,上述代码转换结果完全匹配预期:
- 字符值
155→ 数值155.0 - 字符值
201→ 数值201.0 - 字符值
2.1→ 数值2.1 - 字符值
0.8→ 数值0.8 - 字符值
123.80→ 数值123.8(数值型不存储无意义尾随0,通过格式控制显示效果) - 字符值
12.0→ 数值12.0 - 字符值
00.6→ 数值0.6(无意义前导零自动省略)
注:如果清洗后仍有报错,可以单独对异常观测运行
put Dosis= $hex32.;把变量值打印为十六进制,即可定位具体的非法字符类型。
内容的提问来源于stack exchange,提问作者SAS_newby
相关产品推荐
相关产品推荐

