如果变量具有缺失值,则检查DS是否具有变量值,然后删除该列

时间:2016-02-19 15:13:21

标签: sas sas-macro

我在宏参数中传递一个带有var =的DS,如果它的相应变量具有相同的值,但变量具有所有缺失值,则将其删除。

DATA details;
INPUT id name $ dept $ salary;
datalines;
01 John . 10000
02 Mary . 20000
03 Priya . 30000
05 Ram . 25000

DATA newdetails;
INPUT var_name $ var_core $;
DATALINES;
id perm
name perm
dept perm
salary req

      %macro core_check(inds=,newds=,var_core_val= );
      proc sql noprint;
      select var_name 
      into :varname separated by ' '
      from &newds
      where var_core="&var_core_val.";
      quit;

      %let nvar=&sqlobs;
      %put &varname;

     %do i=1 %to &nvar;
     %let var&i=%scan(&varname,&i);
     proc sql;
     select count(*)
     into :nobs
     from &inds where &&var&i is not missing ;
     %put this = &nobs;
     quit;
     %end;
     %mend;
     %core_check(inds=work.details,newds=work.newdetails,var_core_val=perm); 

1 个答案:

答案 0 :(得分:0)

这是使用PROC FREQ的NLEVELS输出检查空变量的一种方法。请注意,ODS表可能不会根据结果创建NMissLevels或NNonMissLevels变量。

因此,对于您的问题,我们可以创建一个宏,其中包含要检查的数据集的名称,要创建的数据集以及包含哪些变量是可选的元数据的数据集。首先获取要检查的变量列表。然后使用PROC FREQ检查它们。然后使用数据步骤生成带有空变量列表的宏变量。

%macro drop_optional(inds=,newds=,metadata= );
  %local varlist n emptyvars ;
  proc sql noprint;
    select var_name 
     into :varlist separated by ' '
     from &metadata
     where var_core='perm'
    ;
  quit;
  %let n=&sqlobs;
  %if (&n) %then %do;
    ods output nlevels=nlevels;
    proc freq nlevels data=&inds ;
      tables &varlist / noprint ;
    run;
    data nlevels;
      length TableVar $32 NLevels NMissLevels NNonMissLevels 8;
      set nlevels end=eof;
      nmisslevels+0;
      nnonmisslevels=nlevels-nmisslevels;
      length emptyvars $32767;
      retain emptyvars;
      if nnonmisslevels=0 then emptyvars=catx(' ',emptyvars,tablevar);
      if eof then call symputx('emptyvars',emptyvars);
    run;
  %end;
  data &newds;
    set &inds (drop=&emptyvars);
  run;
%mend drop_optional;

让我们使用你的样本数据。

data details;
  input id name $ dept $ salary;
datalines;
01 John . 10000
02 Mary . 20000
03 Priya . 30000
05 Ram . 25000
;

data metadata;
  input var_name $ var_core $;
DATALINES;
id perm
name perm
dept perm
salary req
;

并调用宏。

%drop_optional(inds=details,newds=details_new,metadata=metadata);