如何在SAS中将百分比格式转换为高精度实数?
SAS导入Excel百分比转高精度实数解决方案
导入代码
我用以下SAS代码导入他人的Excel文件(无法修改原文件格式):
Proc Import Out = Net_Yields Datafile = "File.xlsx" dbms = xlsx replace; Getnames = YES; Sheet = "Gtee Vector"; Range = "S5:V45"; Run;
导入后的数据格式
导入后Gross和Net字段为带格式的字符型,显示如下:
| Years | X | Gross | Net |
|---|---|---|---|
| 2008 | 1 | (18.13%) | (19.3%) |
| 2009 | 1 | 25.50% | 23.8% |
| 2010 | 1 | 8.55% | 7.0% |
| 2011 | 1 | ( 6.42%) | ( 7.7%) |
需求
需要将上述百分比转换为高精度实数(保留更多小数位),目标格式如下:
| Years | X | Gross | Net |
|---|---|---|---|
| 2008 | 1 | -0.1812793769191860 | -0.1925832119518600 |
| 2009 | 1 | 0.2550005600450760 | 0.2376731361391290 |
| 2010 | 1 | 0.0854571645604569 | 0.0704705764896025 |
| 2011 | 1 | -0.0641682597261736 | -0.0770890135366603 |
之前尝试格式化最多只能保留5位小数,需要解决方案。
解决方案
SAS内部存储数值为双精度浮点数(支持15-17位有效数字),问题出在字符转数值的清洗逻辑和显示格式设置上,以下是具体代码:
/* 1. 清洗字符型百分比,转换为高精度数值 */ data Net_Yields_clean; set Net_Yields; /* 处理Gross字段:去除括号、百分号、空格,将左括号替换为负号后转数值,再除以100 */ Gross = input(translate(compress(Gross, '()% '), '-', '('), best32.) / 100; /* 处理Net字段 */ Net = input(translate(compress(Net, '()% '), '-', '('), best32.) / 100; run; /* 2. 设置显示格式,确保显示全部有效数字 */ proc datasets library=work nolist; modify Net_Yields_clean; /* BEST32.格式会自动显示最多32位有效数字,适配双精度存储的精度 */ format Gross Net best32.; run; quit;
关键说明
compress(Gross, '()% '):去除字段中的括号、百分号和空格,处理类似( 6.42%)带空格的情况translate(..., '-', '('):将表示负数的左括号(替换为负号-input(..., best32.):将清洗后的字符串转换为数值,best32.确保读取全部有效数字- 除以100:将百分比转换为小数形式
format ... best32.:设置显示格式,让SAS输出存储的全部有效数字,而不是默认的5位小数
内容的提问来源于stack exchange,提问作者Igor Roytman
相关产品推荐
相关产品推荐

