迭代添加到合并的SAS数据集中

时间:2019-09-16 20:58:11

标签: sas sum sas-macro

我有18个单独的数据集,其中包含相似的信息:患者ID,30天等效项的数量以及这些30天等效项的全天供应量。我已经从包含这3个变量以及药物类别(VA_CLASS)及其被捕获的季度(共6个季度)的数据集中输出了这些数据。

sample data

这是我从上面显示的数据集的片段中创建18个单独的数据集的方式:

%macro rx(class,num);
proc sql;
create table dm_sum&clas._qtr&num as select PatID,
sum(equiv_30) as equiv_30_&class._&num
from dm_qtrs
where va_class = "HS&class" and dm_qtr = &qtr
group by 1;
quit;
%mend;
%rx(500,1);
%rx(500,2);
%rx(500,3);
%rx(500,4);
%rx(500,5);
%rx(500,6);
%rx(501,1);

以此类推...

然后,我需要通过PatID将所有18个数据集合并回去,而我想做的是迭代地将创建的下一个数据集添加到上一个,例如,将数据集 dm_sum_500_qtr3 添加到文件中已经包含 dm_sum_500_qtr1 dm_sum_500_qtr1 的结果。

感谢您的光临,布莱恩

1 个答案:

答案 0 :(得分:0)

在宏中,将创建的数据集附加到累加器数据集。确保在开始之前将其删除,以便进行新的累积。如果该进程在不同的时间(例如每周或每月)运行,则可能需要合并一个唯一索引以防止重复追加。如果要堆叠所有这些总和,则create table还应该选择va_classdm_qtr

%macro (class, num, stack=perm.allClassNumSums);
  proc sql; create table dm_sum&clas._qtr&num as … ;
  proc append force base=perm.allClassNumSums data=dm_sum&clas._qtr#
  run;
%mend;

proc sql;
  drop table perm.allClassNumSums;
%rx(500,1)
%rx(500,2)
%rx(500,3)
%rx(500,4)
%rx(500,5)
… 

更好的方法可能是使用具有更大where的单个查询,而将class和qtr保留为分类变量。您当前的方法是将数据(类和qtr)移动到元数据(列名)中。这样的转换使附加的下游处理更加困难。

Proc TABULATE或REPORT可以使用CLASS语句来帮助创建具有基于类别的列的输出。这些过程甚至可以直接处理原始数据集,而无需准备SQL查询。

proc sql;
  create table want as
  select 
    PatID, va_class, dm_qtr,
    sum(equiv_30) as equiv_30_sum
    from dm_qtrs
    where catx(':', va_class, dm_sqt) in 
    (
      'HS500:1'
      'HS500:2'
      'HS500:3'
      … 
      'HS501:1'
    )
    group by PatID, va_class, dm_qtr;
quit;