我想用哈希表计算 100 个变量的分组中位数。
我在 sashelp.cars 上找到了这个来计算发票的中位数,但是如果我想通过品牌和型号来计算中位数,例如,我该如何调整它?
data percentiles ;
keep percentile Invoice ;
format percentile percent5.;
dcl hash ptiles (dataset: "sashelp.cars(where=(Invoice gt 0))",multidata:"Y",ordered:"A");
ptiles.definekey("Invoice");
ptiles.definedone();
declare hiter iterP ("ptiles");
array _ptiles(6) _temporary_ (.5 .05 .1 .25 .75 .95);
call sortn(of _ptiles(*));
num_items=ptiles.num_items;
do i=1 to dim (_ptiles);
percentile=_ptiles(i);
do while (Counter lt percentile*num_items);
Counter+1;
iterP.next();
end;
output;
end;
stop;
set sashelp.cars;
run;
事实上,在我的卷轴数据中,我想计算 100 个变量的中位数。 实际上,我用 proc univariate 来做到这一点,但它太长了(> 12 小时)
这不是一个好主意。您不太可能编写这样比 PROC MEANS 更快的 DATA 步骤:
proc means data=sashelp.cars p5 p10 p25 p50 p75 p95;
var Invoice ;
run ;
注意 PROC MEANS 可能比 PROC UNIVARIATE 快得多,因为它做的工作更少。您还可以尝试简单的 SQL 步骤。
如果您的 UNIVARIATE 步骤花费很长时间,则您可能有大量数据。在我的电脑上,我运行了您的 DATA 步骤和 PROC MEANS 作为输入:
data cars ;
set sashelp.cars ;
do i=1 to 100000 ;
output ;
end ;
run ;
您的 DATA 步骤花了 8 秒,PROC MEANS 花了 2 秒。
另请注意,您的 DATA 步骤有一种非常简单的计算百分位数的方法,它不处理关系。如果您比较步骤的结果,它们将与 PROC UNIVARIATE 或 PROC MEANS 的结果不匹配。
使用 SAS 时需要考虑很多效率因素(数据在哪里?是否涉及网络?等等),但通常您不想对 SAS 提供的功能进行手动编码。