2014-02-21 5 views
0

Я ищу простую функцию, чтобы сказать мне, является ли заданная переменная данного набора данных числовой или нет.SAS: как проверить, является ли переменная числовой?

Я хотел бы использовать его как это в заявлении, если в макроязыке:

%if isNumeric(ds,var) %then %do ... 

Но я не могу найти способ для достижения этой цели просто. У вас есть идеи, если это возможно?

Я знаю, что это, вероятно, тривиально, но любая помощь будет оценена!

Спасибо!

+0

Вы должны также уточнить, если вы спрашиваете, является ли переменная напечатал числовой (т.е. хранится в виде 8 байт с плавающей точкой) или является ли переменная содержит числовые-допустимые символы (например, «132» есть " 12AR "нет). – Joe

ответ

1

Вы недавно изменили свой вопрос, так я думал, что вклад со следующей «простой функцией»:

%if %mf_getvartype(sashelp.class,age)=N %then %put This var is numeric; 
%if %mf_getvartype(sashelp.class,name)=C %then %put This var is character; 

mf_getvartype макро функция доступна в базовой macropeople библиотеке here и воспроизводится ниже :

/** 
    @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; 
4

Предполагая, что вы хотите знать фактический тип, а не содержимое переменной, есть vartype(dsid,var-num)function которая имеет точные спецификации вам нужно, за исключением того, что нужно 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)); 
+0

Что делать, если тип переменной является буквенным, но содержание - это число? Что мы можем сделать, если хотим знать, является ли это количество? –

+0

Это другой вопрос, и вы должны спросить его как одного! Хотя вы можете посмотреть [этот вопрос] (https://stackoverflow.com/questions/16993089/logical-function-in-sas-to-determine-if-a-particular-value-of-a-variable-is- nume) сначала. – Joe

+0

OK! Благодарю. Я видел ссылку. Регулярное выражение Perl может быть хорошим решением. –

1

на шаге данных с помощью функции VType, мы можем также определить тип переменной поддавки из набора данных.

data _NULL_; 
    set sashelp.class (obs=1); 
    call symput('numvar',ifc(vtype(sex)='N','YES','NO')); 
run; 
%put |&numvar|; 

или вместо вызова symput мы можем использовать следующую инструкцию для других целей.

if ifc(vtype(sex)='N','YES','NO')='YES';

Смежные вопросы