Sas 如何根据分位数筛选数据集

Sas 如何根据分位数筛选数据集,sas,quantile,Sas,Quantile,在下面的代码中,我如何仅保留优于第95个分位数的观测值 data test; input business_ID $ count; datalines; 'busi1' 2 'busi1' 10 'busi1' 4 'busi2' 1 'busi3' 2 'busi3' 1 ; run; proc sort data = test; by descending count; run; 我不知道如何干净地储存四分位数,然后在if条件下重新使用它 谢谢 编辑:我可以用以下代码确定分位数:

在下面的代码中,我如何仅保留优于第95个分位数的观测值

data test;
input business_ID $ count;
datalines;
'busi1' 2
'busi1' 10
'busi1' 4
'busi2' 1
'busi3' 2
'busi3' 1
;
run;

proc sort data = test;
    by descending count;
run;
我不知道如何干净地储存四分位数,然后在if条件下重新使用它

谢谢

编辑:我可以用以下代码确定分位数:

proc means data=test noprint; 
var count;
output out=quantile P75= / autoname;
run;

但是如何在
测试数据集中关联它,以便我可以选择该分位数以上的每个观察值?

您可以读取宏变量中分位数的值,以便在后续
if
where
条件中使用:

data test;
input business_ID $ count;
datalines;
'busi1' 2
'busi1' 10
'busi1' 4
'busi2' 1
'busi3' 2
'busi3' 1
;
run;

proc sort data = test;
    by descending count;
run;
proc means data=test noprint; 
var count;
output out=quantile P75= / autoname;
run;

data _null_;
set quantile;
call symput('quantile',count_p75);
run;

data test;
set test;
where count > &quantile.;
run;
或者可以使用SQL子查询

proc means data=test noprint; 
var count;
output out=quantile P75= / autoname;
run;

proc sql undo_policy=none;
create table test as
select *
from test
where count > (select count_p75 from quantile)
;
quit;

(请注意,您的问题提到了第95个分位数,而您的示例代码提到了第75个分位数)

User2877959的解决方案是可靠的。最近我用Proc-Rank做了这个。解决方案有点“绕开y”,但可以节省大量打字

proc rank data=Input groups=1000 out=rank_out; 
    var var_to_rank; 
    ranks Rank_val; 
run;

data seventy_five;
    set rank_out;
    if rank_val>750;
run;

更多关于排名的信息:

发布您迄今为止的尝试。您可以使用PROC均值、单变量或秩来查找百分位数。