SAS:如何测试变量是否为数字

SAS:如何测试变量是否为数字,sas,Sas,我正在搜索一个简单的函数,告诉我给定数据集的给定变量是否为数字 我想在宏语言的if语句中这样使用它: %if isNumeric(ds,var) %then %do ... 但我找不到任何简单的方法来实现这一点。你知道这是否可行吗 我知道这可能是微不足道的,但任何帮助都将不胜感激 谢谢 假设您想知道实际类型,而不是变量的内容,则有一个vartype(dsid,var num)具有您所需的确切规范,但需要var num而不是var name。文档中的这个例子应该让您开始学习;您可以对此进行调整,

我正在搜索一个简单的函数,告诉我给定数据集的给定变量是否为数字

我想在宏语言的if语句中这样使用它:

%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|;