从sas中的数据集中删除N最高

时间:2015-07-02 23:15:45

标签: sas

我有一堆不同长度的sas数据集,我需要用变量值修剪第n个最高值和最低值。

要做到这一点,当我需要修剪最高和最低时我做了这个

    DATA VDBP273_first_night_Systolic; 
     SET VDBP273_first_night  end=eof; 
       IF _N_ =1 then delete;  
        if eof then delete; 
     run;

它运作良好。

现在我需要做更像这样的事情

 PROC SORT DATA=foo OUT=foo_sorted; 
      BY bar;
          run;


    DATA foo_out; 
     SET foo_sorted end=eof; 
       IF _N_ <= 5  then delete;  
        if eof *OR THE 4 right before it* then delete; 
     run;

我确信这很容易,但它让我很难过。怎么说这个排序数据集的最后5个删除了那些?

3 个答案:

答案 0 :(得分:3)

由于您正在预先分配数据,然后尝试消除前n个和后n个记录,因此您可以使用OBS =和FIRSTOBS = dataset选项轻松解决问题。

proc sql noprint;
  select count(*) -4 into:counter from sashelp.class ;
quit;
proc sort data=sashelp.class out=have;by height;run;
proc print data=have;run;
data want;
  set have(firstobs=6 obs=&counter);
run;
proc print data=want;run;

答案 1 :(得分:0)

您可以使用nobs=数据集选项来存储观察总数,这意味着您可以执行与代码类似的操作来排除上/下n条记录。 我建议将要排除的记录数放在宏变量中,这样可以比硬编码更容易阅读和更改。

%let excl = 6;

data want;
  set sashelp.class nobs=numobs;
  if &excl.< _n_ <=(numobs-&excl.);
run;

答案 2 :(得分:0)

或者只是执行之前完成的相同步骤,将降序添加到proc排序变量

proc sort data=have out=want; by var1 descending; run;