我有一个变量,主要是数值,但偶尔会有一个字符偷偷摸摸.因此,变量作为字符存储在SAS中.我希望能够确定此字符变量中的各个值是否为数字.在知道哪些值是数字以及哪些是字符之后,我想创建一个新的(数字)变量,其中字符变量的数值存储为数字,字符值存储为缺失.
这是一个例子.
char_var --> num_var
a .
1 1
2.34 2.34
## .
cat .
Run Code Online (Sandbox Code Playgroud)
我希望能够像下面这样做,但我错过了一个功能来帮助我:
if char_var=is.numeric(char_var) then num_var=char_var;
else num_var=.;
Run Code Online (Sandbox Code Playgroud)
这is.numeric将是一个能够为我确定这一点的函数.
任何建议表示赞赏.
在旁注中,RI会尝试(可能不正确)编程,如下所示:
mydata$type<-is.numeric(mydata$char_var)
if (mydata$type==1) {mydata$num_var=mydata$char_var} else {mydata$num_var=NA}
mydata$num_var<-as.numeric(mydata$num_var)
Run Code Online (Sandbox Code Playgroud)
将此数据集用于所有示例:
data have;
input xchar $;
datalines;
1
123
123.54
1234.43
123.1.4
124A
234.1A
1234E5
12.34E7
;;;;
run;
Run Code Online (Sandbox Code Playgroud)
根据您的需要,有很多不同的处理方法.
首先,您可以让SAS为您处理; Bob提供了这样的解决方案.不过,我认为这种形式非常糟糕; 而在他的程序中很明显你是故意这样做的,在更长的代码中它并不总是显而易见的,因此它可能会混淆其他程序员和/或导致数据错误.我不允许涉及故意隐式转换的代码在没有充分理由的情况下将其投入生产.
您可以使用input语句进行转换,这是SAS处理事物的更好版本.在这种情况下,您可以轻松禁止有关无效转换的警告消息.领先?抑制转换错误; 单身?会导致一行打印到日志中以进行无效转换,但不如没有那么突兀.
data want_qmark;
set have;
xnum = input(xchar,??BEST12.);
run;
Run Code Online (Sandbox Code Playgroud)
你可以明确检查字段; 这在很大程度上取决于您的数据.以下内容适用于简单的数字字段,但最后两个(使用科学记数法)失败,并且在带有两位小数的行上失败.
if missing(compress(xnum,'.','d')) then xnum=input(xchar,best12.);
Run Code Online (Sandbox Code Playgroud)
您也可以编写自己的isnumeric函数.以下使用相当健壮的perl正则表达式(但不完美,并且不包括许多有效的数字变体,如逗号或百分数;如果您的数据建议,可以添加它们).
options cmplib=work.funcs;
proc fcmp outlib=work.funcs.test;
function isnumeric(value $);
prx = prxparse('/^-?\d+\.?\d*(e\d+)?$/io');
rc = prxmatch(prx,trimn(value));
return(rc);
endsub;
quit;
data want_fcmp;
set have;
if isnumeric(xchar) then xnum=input(xchar,BEST12.);
run;
Run Code Online (Sandbox Code Playgroud)
对于大多数用途简单的输入?? ?? 可能已经足够了.
| 归档时间: |
|
| 查看次数: |
13492 次 |
| 最近记录: |