sas 9.4 中哈希表的中值

问题描述 投票:0回答:1

我想用哈希表计算 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 小时)

sas hashtable hashcode median
1个回答
0
投票

这不是一个好主意。您不太可能编写这样比 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 提供的功能进行手动编码。

© www.soinside.com 2019 - 2024. All rights reserved.