Error handling 抑制SAS中缺少值的log10错误

Error handling 抑制SAS中缺少值的log10错误,error-handling,sas,Error Handling,Sas,我有一段由某人提供的代码,用于确定手机号码是否以7开头: if int(abs(mobile_telephone1)/10**int(log10(abs(mobile_telephone1)))) ne 7 then do ..... 这非常有效,但如果缺少该值,我会收到大量错误消息,我想知道是否有办法抑制此特定语句的错误消息?您不能抑制特定函数的错误(通常),但可以在数据步骤之前禁用它们,然后在数据步骤之后重新应用它们 options errors=0 ; data xyz ;

我有一段由某人提供的代码,用于确定手机号码是否以7开头:

if int(abs(mobile_telephone1)/10**int(log10(abs(mobile_telephone1)))) ne 7
    then do .....

这非常有效,但如果缺少该值,我会收到大量错误消息,我想知道是否有办法抑制此特定语句的错误消息?

您不能抑制特定函数的错误(通常),但可以在数据步骤之前禁用它们,然后在数据步骤之后重新应用它们

options errors=0 ; data xyz ; /* some code */ run ; options errors=25 ; 选项错误=0; 数据xyz; /*一些代码*/ 跑 选项错误=25; 但是,为什么不更简单地完成它而不冒任何错误的风险呢

data xyz ; tel = 7123455678 ; chartel = put(tel,12.) ; if chartel =: '7' then istel = 1 ; run ; 数据xyz; 电话:7123455678 ;; chartel=put(电话,12); 如果chartel=:'7',则istel=1; 跑
要更具体地回答您的问题(尽管Chris的解决方案肯定是可行的),您可以使用
coalesce
功能

if log10(coalesce(mobile_telephone1,1)) ...
Coalesce返回第一个非缺失值。在这种情况下,当然0也是一个不可接受的结果,所以我使用1,因为它看起来无害

另外,一个更好的基于数学的解决方案是

if (mod(mobile_telephone1,1e10) - mod(mobile_telephone1,1e9) = 7e9) ...

不需要使用log10s之类的,只需比较模。

Chris,有趣的是,我已经将它从char转换为numeric来执行log10,您的答案在一个步骤中解决了整个问题。字符字段以零开头,所以我假设使用“=:”07”就可以了?“=:”07”似乎很有效,非常感谢,真不敢相信我错过了它!当然,您可以在不创建新字符变量的情况下执行此操作:
if char(put(tel,z10.),2)='7'
if put(tel,z10.)=:'07'
(看起来您想知道第二个数字是否是7?)