SAS-从字符变量中提取除数字或“0”以外的其他字符的观察值&引用;?

SAS-从字符变量中提取除数字或“0”以外的其他字符的观察值&引用;?,sas,Sas,我试图找出一个小的编码挑战 我有一个变量RESULT,它是一个字符变量,但需要转换为数字。大多数结果都是正则数,即“90”、“90.0”、“55.42”等。然而,也有许多奇怪的结果,如“不可检测”或“1.29E7”等结果 我要做的是提取除数字或值“.”(即句点)以外的所有字符。然后我可以手动分配这些值 我有一个非常大的数据集,但计算能力有限,所以我无法滚动浏览并找出带有特殊字符的奇怪观察结果。它只是冻结了我的电脑,花的时间太长了 关于如何最好地实现这一点的想法?是否有SAS功能可用于此类任务?我

我试图找出一个小的编码挑战

我有一个变量RESULT,它是一个字符变量,但需要转换为数字。大多数结果都是正则数,即“90”、“90.0”、“55.42”等。然而,也有许多奇怪的结果,如“不可检测”或“1.29E7”等结果

我要做的是提取除数字或值“.”(即句点)以外的所有字符。然后我可以手动分配这些值

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

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


谢谢大家!

你就不能得到一组不同的非数值吗?这应该比每一个非数值的观测值都要小

测试有效数字的一种方法是让SAS为您进行测试。
INPUT()
函数可以将文本字符串转换为数字。如果您使用
逗号
信息,那么除了正确转换科学符号值(如
1.29E7
),它还可以处理带有逗号或美元符号的值

 proc sql ;
    create table want as
      select distinct result
      from have
      where result not in (' ','.') 
        and input(result,comma32.)=.
    ;
quit;
这应该会找到“不可检测”之类的值,但将“90”、“90.0”、“55.42”、“1.29E7”或“12345”之类的值视为有效数字。

将根据您的精确语言为您很好地处理此问题。使用列表修饰符从第二个参数中添加数字(第三个参数)加上“.”

注意,这不会识别无效的数字(如最后一个)

试试这个:

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;

好主意,但是OP特别调用了
1.29E7
,因此应该标记…?啊,是的,但是
1.29E7
是一个有效的数字。当然,但它可能不适用于他们的特定用例。OP想要的与您所做的相反。而且,我不鼓励您发布的“惰性约定”,SAS中的输入函数没有足够多的输入,也不需要忽略警告。哦,是的,我没有明确阅读主题,但是,OP应该写
if count(result),'.')>1或notdigit(compress(trim(result),'.'))
insted,并且不需要转换(惰性或不惰性)全部:)您想要结果的无效值列表还是具有无效结果的完整记录集?前者应该小得多,但可能更难映射到值,因为该值没有上下文。感谢所有有用的评论!我想出了一个似乎有效的解决方案:flag=0;比较器=压缩(结果为“1234567890”);如果比较器^=“”,则标志=1;这将标记除数字和“.”以外的任何字符的观察结果。从这里,我可以添加进一步的处理,以处理典型的特殊字符(例如>40、~5000等)。抱歉,如果这不清楚……我不确定我在OP中是否解释得很好。我感谢您的帮助。不规则请参阅下面的@joe压缩答案。我认为它和你描述的一样,而且更整洁。压缩功能可以达到这个目的。但在内部,COMPRESS还将逐行检查每个记录是否有任何不需要的字符。所以,如果数据集非常大,并且计算能力不是很强,那么即使压缩也会挂起。无法避免逐行扫描整个数据集。
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;