gpt4 book ai didi

sas - SAS 中的逻辑函数来确定变量的特定值是否为数字?

转载 作者:行者123 更新时间:2023-12-04 15:58:34 55 4
gpt4 key购买 nike

我有一个主要是数值的变量,但是偶尔会有一个字符偷偷进入。因此,变量在 SAS 中存储为字符。我希望能够确定此字符变量中的各个值是否为数字。在知道哪些值是数字哪些是字符后,我想创建一个新的(数字)变量,其中字符变量的数值存储为数字,字符值存储为缺失值。

这是一个例子。

   char_var -->   num_var
a .
1 1
2.34 2.34
## .
cat .

我希望能够做到像下面这样,但我缺少一个功能来帮助我:
if char_var=is.numeric(char_var) then num_var=char_var;
else num_var=.;
is.numeric将是一个可以为我确定这一点的函数。

任何建议表示赞赏。

附带说明一下,在 R 中,我会尝试(可能不正确)按如下方式进行编程:
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)

最佳答案

将此数据集用于所有示例:

data have;
input xchar $;
datalines;
1
123
123.54
1234.43
123.1.4
124A
234.1A
1234E5
12.34E7
;;;;
run;

根据您的需要,有很多不同的处理方法。

首先,您可以让 SAS 为您处理; Bob 提供了这样的解决方案。不过,我认为这种形式非常糟糕;虽然在他的程序中很明显你是故意这样做的,但在较长的代码中并不总是很明显,因此它可能会混淆其他程序员和/或导致数据错误。我不允许涉及有意隐式转换的代码在没有充分理由的情况下将其投入生产。

您可以使用 input 语句进行转换,这是 SAS 处理事物的更好版本。在这种情况下,您可以轻松抑制有关无效转换的警告消息。领先??抑制转换错误;一个?会导致将一行打印到日志中以进行无效转换,但比没有 ? 更显眼。
data want_qmark;
set have;
xnum = input(xchar,??BEST12.);
run;

您可以明确检查该字段;这在很大程度上取决于您的数据。以下适用于简单的数字字段,但在最后两个(使用科学记数法)和带有两位小数的行上失败。
if missing(compress(xnum,'.','d'))  then xnum=input(xchar,best12.);

您也可以编写自己的 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;

对于大多数用途,使用 ??可能就足够了。

关于sas - SAS 中的逻辑函数来确定变量的特定值是否为数字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16993089/

55 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com