繁体   English   中英

如何通过数据步骤或 proc sql 查询 SAS 循环多个数据集?

[英]How can I loop multiple datasets through a data step or proc sql query SAS?

我有多个数据集(100 多个),它们都包含相同的 3 列(code_num、replicate、total_qty),每个列都有不同的代码(code_num)。

data code_num_1
code_num replicate total_qty
12345       376       45
12345       76        67
12345       943       300
.
.

data code_num_2
code_num replicate total_qty
12234       85       746
12234       900      35
12234       726      273
.
.

等等。

如果可能的话,我想通过数据步骤运行这些数据集:

data test;
set test_; <-- datasets will go here...
if _N_ in(&PercentileRow10,&PercentileRow20,&PercentileRow30,&PercentileRow40,&PercentileRow50,&PercentileRow60,&PercentileRow70, &PercentileRow80,&PercentileRow90);
run;

*注意:&percentilerow 是一个宏变量,将从数据集中获取百分位数。 列数量将决定百分位数。 我事先有这一步:

proc sql no print; 

create table ___ as select code_num, replicate, sum(qty) as total_qty from ____ group by code_num, replicate order by total_qty; 放弃;

理想情况下,我想获得每个数据集的百分位数并创建一个新数据集,其中包含每个百分位数和它发生的相关复制以及总数。 我可以使用宏并执行循环来通过此数据集运行我的数据集以生成新的数据集吗?

data code_num_1_perc
percentile replicate qty
10           87      45
20           933     65
30           34      100
.
.
90           467      837

对于每个数据集 code_num_#,这是我理想的 output。 如果可能的话

如果我理解的要求是正确的,那么建议的方法是有缺陷的。

例如,1、2、3、4、5、6、7、8、9、10 等系列的中位数(第 50 个百分位数)为 5.5。 5.5 不是数据集中的值,那么如何选择重复数?

我的建议是完全不同的过程。 查看 PROC RANK 以了解如何处理关系以及您希望如何处理它们。 您没有指定将使用哪个变量来计算百分位数。

  1. 将所有数据集合并为一个,加入一个数据集标识符来唯一标识每个数据集。
data combined;
length source data_set_name $50.;
set code_num_: indsname = source;
data_set_name = source;
run;
  1. 使用 PROC RANK 分组为十分位数
proc rank data=combined out=combined_deciles groups=10;
by data_set_name;
var total_qty;
ranks PRanks;
run;
  1. 获取每个排名的第一个(或最后一个,根据要求)值
data want;
set combined_deciles;
by datasetName Pranks;
if first.Pranks;
run;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM