我正试图在这里找出一个小编码挑战。
我有一个变量RESULT,它是一个字符变量,但需要转换为数字。大多数结果都是常规数字,即“90”,“90.0”,“55.42”等。但是,有很多奇怪的结果,例如“无法接受”或“1.29E7”或这样的结果。
我想要做的是提取所有具有除数字以外的字符或值“。”的观察结果。 (即一段时间)。然后我可以手动分配这些值。
我有一个非常大的数据集,但计算能力有限,所以我无法滚动浏览并选择带有特殊字符的奇怪观察。它只是冻结我的电脑,并且需要太长时间。
关于如何最好地实现这一目标的想法?是否有适用于此类任务的SAS功能?我已经考虑过压缩函数,但我需要确保我没有遗漏任何特殊字符的观察结果(即数字和句点以外的字符)。
谢谢!
答案 0 :(得分:1)
COMPRESS
会根据您的语言很好地为您处理。使用list修饰符添加数字(第3个参数)加'。'从第二个参数。
请注意,这不会识别无效数字的数字(如最后一个数字)。
data have;
input @1 char_var $30.;
datalines;
1.234
4.15E7
UNDETECTED
-143.32
+144.12
79.32°F
14.14.14
;;;;
run;
data want;
set have;
if compress(char_Var,'.','d') ne ' ';
run;
答案 1 :(得分:0)
难道你不能获得一组独特的非数字值吗?这应该小于每个具有非数值的观察值。
测试有效号码的一种方法是让SAS为您完成。 INPUT()
函数可以将文本字符串转换为数字。如果你使用COMMA
信息,那么除了正确转换科学记数法值,如1.29E7
,这只是12900000,它还可以用逗号或美元符号处理值。
proc sql ;
create table want as
select distinct result
from have
where result not in (' ','.')
and input(result,comma32.)=.
;
quit;
应找到“UNDETECTABLE”之类的值,但将“90”,“90.0”,“55.42”,“1.29E7”或“12,345”等值视为有效数字。
答案 2 :(得分:0)
试试这个:
data out; /*output dataset*/
set in; /*input dataset*/
result = trim(result); /*trailing blanks - not have to be a problem*/
clear_number = compress(result, '.'); /*remove period from result*/
/*then, clear_number have to have only digits, so:*/
if notdigit(clear_number) then delete;
/*but, maybe, result have more then one period?*/
if count(result, '.') > 1 then delete;
result_numeric = result*1; /*lazy convertion*/
run;