SAS:如何测试变量是否为数字
我正在搜索一个简单的函数,告诉我给定数据集的给定变量是否为数字 我想在宏语言的if语句中这样使用它:SAS:如何测试变量是否为数字,sas,Sas,我正在搜索一个简单的函数,告诉我给定数据集的给定变量是否为数字 我想在宏语言的if语句中这样使用它: %if isNumeric(ds,var) %then %do ... 但我找不到任何简单的方法来实现这一点。你知道这是否可行吗 我知道这可能是微不足道的,但任何帮助都将不胜感激 谢谢 假设您想知道实际类型,而不是变量的内容,则有一个vartype(dsid,var num)具有您所需的确切规范,但需要var num而不是var name。文档中的这个例子应该让您开始学习;您可以对此进行调整,
%if isNumeric(ds,var) %then %do ...
但我找不到任何简单的方法来实现这一点。你知道这是否可行吗
我知道这可能是微不足道的,但任何帮助都将不胜感激
谢谢 假设您想知道实际类型,而不是变量的内容,则有一个
vartype(dsid,var num)
具有您所需的确切规范,但需要var num
而不是var name
。文档中的这个例子应该让您开始学习;您可以对此进行调整,以使用它来计算特定变量
%let dsid=%sysfunc(open(mydata,i));
%let varlist=;
%do i=1 %to %sysfunc(attrn(&dsid,nvars));
%if (%sysfunc(vartype(&dsid,&i)) = N) %then
%let varlist=&varlist %sysfunc(varname
(&dsid,&i));
%end;
%let rc=%sysfunc(close(&dsid));
你最近编辑了你的问题,所以我想我会用以下“简单函数”来做贡献: SASjs核心库中提供了
mf_getvartype
宏函数,如下所示:
/**
@file
@brief Returns variable type - Character (C) or Numeric (N)
@details
Usage:
data test;
length str $1. num 8.;
stop;
run;
%put %mf_getvartype(test,str);
%put %mf_getvartype(work.test,num);
@param libds Two part dataset (or view) reference.
@param var the variable name to be checked
@return output returns C or N depending on variable type. If variable
does not exist then a blank is returned and a note is written to the log.
@version 9.2
@author Allan Bowe
@copyright GNU GENERAL PUBLIC LICENSE v3
**/
%macro mf_getvartype(libds /* two level name */
, var /* variable name from which to return the type */
);
%local dsid vnum vtype rc;
/* Open dataset */
%let dsid = %sysfunc(open(&libds));
%if &dsid. > 0 %then %do;
/* Get variable number */
%let vnum = %sysfunc(varnum(&dsid, &var));
%if(&vnum. > 0) %then
/* Get variable type (C/N) */
%let vtype = %sysfunc(vartype(&dsid, &vnum.));
%else %do;
%put NOTE: Variable &var does not exist in &libds;
%let vtype = %str( );
%end;
%end;
%else %put dataset &libds not opened! (rc=&dsid);
/* Close dataset */
%let rc = %sysfunc(close(&dsid));
/* Return variable type */
&vtype
%mend;
在使用vtype函数的数据步骤中,我们还可以从数据集确定给定变量的类型
data _NULL_;
set sashelp.class (obs=1);
call symput('numvar',ifc(vtype(sex)='N','YES','NO' ));
run;
%put |&numvar|;
或者,我们可以将以下语句用于其他目的,而不是调用symput
如果ifc(vtype(sex)='N','YES','NO')='YES'代码>如果您询问变量是否为数字类型(即,存储为8字节浮点),或者变量是否包含数字有效字符(即,“132”为,“12AR”为非数字)。如果变量类型为字母,但内容为数字,该怎么办?如果我们想知道内容是一个数字,我们可以做什么?这是一个不同的问题,你应该作为一个整体来问!虽然你可以先看看,好的!谢谢我看到了链接。Perl正则表达式可以是一个很好的解决方案。
data _NULL_;
set sashelp.class (obs=1);
call symput('numvar',ifc(vtype(sex)='N','YES','NO' ));
run;
%put |&numvar|;