如何根据数据集的分位数过滤数据集

时间:2017-10-14 20:48:02

标签: 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条件下重新使用它。

由于

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

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

但是如何在Test数据集中与它相关联,以便我可以选择高于该分位数的每个观察值?

2 个答案:

答案 0 :(得分:0)

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

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个分位数)

答案 1 :(得分:0)

User2877959的解决方案很扎实。最近我用 Proc Rank 做了这个。解决方案有点“解决问题”,但节省了很多打字。

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;

更多关于等级:http://documentation.sas.com/?docsetId=proc&docsetTarget=p0le3p5ngj1zlbn1mh3tistq9t76.htm&docsetVersion=9.4&locale=en