SAS - 从字符变量中提取具有除数字或“。”之外的字符的观察值?

时间:2015-11-30 16:59:00

标签: sas

我正试图在这里找出一个小编码挑战。

我有一个变量RESULT,它是一个字符变量,但需要转换为数字。大多数结果都是常规数字,即“90”,“90.0”,“55.42”等。但是,有很多奇怪的结果,例如“无法接受”或“1.29E7”或这样的结果。

我想要做的是提取所有具有除数字以外的字符或值“。”的观察结果。 (即一段时间)。然后我可以手动分配这些值。

我有一个非常大的数据集,但计算能力有限,所以我无法滚动浏览并选择带有特殊字符的奇怪观察。它只是冻结我的电脑,并且需要太长时间。

关于如何最好地实现这一目标的想法?是否有适用于此类任务的SAS功能?我已经考虑过压缩函数,但我需要确保我没有遗漏任何特殊字符的观察结果(即数字和句点以外的字符)。

谢谢!

3 个答案:

答案 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;