使用SAS根据其中的值之和删除变量

时间:2016-12-05 21:11:20

标签: optimization sas datastep

我希望将列放在SAS数据集中,该数据集的总和小于特定值。考虑下面的情况。

Column_A Pred_1 Pred_2 Pred_3 Pred_4 Pred_5
A             1      1      0      1      0
A             0      1      0      1      0
A             0      1      0      1      0
A             0      1      0      1      1
A             0      1      0      0      1

让我们假设我们的阈值是4,所以我希望丢弃具有小于4的活动观测值之和的预测变量,因此输出看起来像

Column_A  Pred_2  Pred_4 
A             1       1
A             1       1
A             1       1
A             1       1
A             1       0

目前我正在使用一种非常低效的方法来使用多个转置来删除预测变量。有多个记录>的数据集; 30,000这样的转置方法需要时间。如果有人有更有效的解决方案,我将不胜感激!

谢谢!

2 个答案:

答案 0 :(得分:2)

好像你可以这样做:

  1. 运行PROC MEANS或类似的proc以获得总和
  2. 创建一个宏变量,其中包含数据集中所有变量,其中<门限
  3. 删除这些变量
  4. 然后没有TRANSPOSE或者其他什么,只是常规的简单旧摘要和丢弃。请注意,您应使用ODS OUTPUT而不是OUT=中的PROC MEANS,否则您必须PROC TRANSPOSE正常的PROC MEANS OUT=数据集。

    使用普通数据集的示例:

    data have;
      array x[20];
      do _n_ = 1 to 20;
        do _i = 1 to dim(x);
          x[_i] = rand('Uniform') < 0.2;
        end;
        output;
      end;
    run;
    
    ods output summary=have_sums;  *how we get our output;
    ods html select none;          *stop it from going to results window;
    proc means data=have stackodsoutput sum;  *stackodsoutput is 9.3+ I believe;
      var x1-x20;
    run;
    ods html select all;           *reenable normal html output;
    
    %let threshhold=4;             *your threshhold value;
    
    proc sql;
      select variable
        into :droplist_threshhold separated by ' '
        from have_sums
        where sum lt &threshhold;  *checking if sum is over threshhold;
    quit;
    
    data want;
      set have;
      drop &droplist_threshhold.;  *and now, drop them!;
    run;
    

答案 1 :(得分:1)

只需使用PROC SUMMARY即可获得总和。然后,您可以使用数据步骤生成要删除的变量名称列表。

%let threshhold=4;
%let varlist= pred_1 - pred_5;

proc summary data=have ;
  var &varlist ;
  output out=sum sum= ;
run;

data _null_;
  set sum ;
  array x &varlist ;
  length droplist $500 ;
  do i=1 to dim(x);
    if x(i) < &threshhold then droplist=catx(' ',droplist,vname(x(i)));
  end;
  call symputx('droplist',droplist);
run;

然后,您可以使用宏变量生成DROP语句或DROP=数据集选项。

drop &droplist;