我有一堆不同长度的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个删除了那些?
答案 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;