我是 SAS 的新手,很难对此进行编程。
我必须检查所有必需的变量是否都在数据集中。如果变量缺失,那么缺失的变量应该简单地列在一个新的数据集中。
假设我的原始数据集(酒店)有 20 个变量和 100 个观察值。
如果缺少 2 个变量,则新数据集 (misvar) 应包含一个变量,该变量列出了 hotel 的 2 个 missinng 变量。
最好的方法是什么?
我尝试了不同的东西,但似乎没有任何效果。
我写了这个宏,它检查某个变量是否在数据集中。如果是,则变量的位置出现在日志中。如果否,则 0 出现在日志中。
%macro varcheck (newvar, dataid);
%let daid = %sysfunc(open(&dsname));
%let vari = %sysfunc(varnum(&daid,&newvar));
%let clo = %sysfunc(close(&daid));
&val
%mend varcheck;
但是,我努力将这段代码与开头描述的其他要求结合起来。
您可能不需要尝试使用宏代码来执行此操作。
假设您有一个包含所需变量列表的数据集。所以像:
data required;
length name $32 ;
input name @@ ;
cards;
ID DATE STATUS
;
现在让我们制作一个包含一些但不是所有这些变量的数据集。
data have;
length ID 8 DATE 8 REASON $100 ;
run;
现在我们可以用简单的数据步骤创建一个包含所需变量列表的数据集,这些变量不在 HAVE 中。
data notfound ;
retain dsid;
if _n_=1 then dsid=open("HAVE");
if eof then dsid=close(dsid);
set required end=eof;
if varnum(dsid,name) then delete;
drop dsid;
run;
让我们使用
class
库中的 sashelp
数据集进行尝试。
proc print data=sashelp.class;
run;
如果您需要这种情况,只需像这样编程:
data MISSING ;
dsid=open('sashelp.class');
length name $32;
do name = 'sex', 'gender', 'AGE', 'Weight', 'shoe_size';
if not varnum(dsid, name) then output;
end;
drop dsid;
proc print;
run;
如果你经常需要这个,你可以使用这个宏:
%macro list_missing_fields(data, out, required);
%macro _; %mend _; * restore syntax highlighting hack;
data &out;
dsid = open("&data");
length name $32;
%do no = 1 %to %sysfunc(countw(&required));
name = "%scan(&required, &no)";
if not varnum(dsid, name) then output;
%end;
drop dsid;
run;
%mend;
%list_missing_fields(sashelp.class, missing_in_class,
sex gender AGE Weight shoe_size name sur_name);