SAS字符转数值变量问题:逗号作小数分隔符时转换失败
这个问题我之前也碰到过!核心原因是SAS默认把点.当作小数分隔符,当你传入带逗号,的字符数值时,它会判定这不是合法的数值格式,所以INPUT函数直接返回缺失值.。给你几个更规范的解决方案,比手动替换字符要靠谱得多:
方案1:用SAS内置的欧洲数值格式(EURw.d)
SAS专门提供了适配欧洲地区(用逗号做小数分隔符)的EURw.d格式,直接用它就能完成转换,完全不用手动替换:
data temp; old = '1,61'; new = input(old, EUR5.2); run;
这个格式会自动识别逗号为小数分隔符,运行后new的值就是1.61,完美解决问题。
方案2:全局设置系统选项,让SAS默认认逗号为小数分隔符
如果你的数据集里大量都是这种逗号做小数分隔符的数值,直接全局设置系统选项更省心:
options decimalcomma=yes; /* 告诉SAS:以后默认用逗号当小数分隔符 */ data temp; old = '1,61'; new = input(old, 5.2); /* 用普通的数值格式就能正常转换了 */ run;
设置后,后续所有的数值解析都会把逗号当作小数分隔符,点则会被识别成千分位分隔符(比如1.234,56会被解析为1234.56)。要是之后需要恢复默认规则,执行options decimalcomma=no;就行。
方案3:更简洁的字符替换(如果不想改格式/选项)
要是你就想临时处理几条数据,也可以用TRANSLATE函数替代TRANWRD,语法更短:
data temp; old = '1,61'; new = input(translate(old, '.', ','), 5.2); run;
TRANSLATE会直接把字符串里所有的逗号换成点,效果和TRANWRD一样,但代码更简洁。
小总结
- 偶尔处理这类数据:用
EURw.d格式最方便; - 批量处理:设置
DECIMALCOMMA=YES是最规范的全局解决方案; - 替换字符的方法虽然能用,但属于临时 workaround,不如前两种符合SAS的规范用法。
内容的提问来源于stack exchange,提问作者kurp
相关产品推荐
相关产品推荐

