【问题标题】:Iteratively adding to merged SAS dataset迭代添加到合并的 SAS 数据集
【发布时间】:2019-09-19 10:59:19
【问题描述】:

我有 18 个单独的数据集,其中包含类似的信息:患者 ID、30 天当量的数量以及这些 30 天当量的总天供应量。我从包含这 3 个变量以及药物类别 (VA_CLASS) 和捕获它的季度(总共 6 个季度)的数据集中输出了这些数据。

以下是我从上面显示的数据集片段创建 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_qtr1dm_sum_500_qtr1 的结果。

感谢您的关注,布赖恩

【问题讨论】:

  • 返回并重做此操作,这样您的数据中就有四分之一,而不是 18 个数据集。然后使用 PROC TRANSPOSE 来翻转它而不是宏。它更快、更高效、更动态。
  • 我正在考虑这个问题,但在 TRANSPOSE 中翻转后,我担心包含错误数据的季度,并且在我对程序的审查中,我意识到 ID 选项可以解决这个问题。谢谢。
  • ID 将为您提供干净的 ID,IDLABEL 将为您提供干净的标签以用于显示目的。

标签: sas sum sas-macro


【解决方案1】:

在宏中将创建的数据集附加到一个累加器数据集。请务必在开始之前将其删除,以便有新的积累。如果该过程在不同的时间(如每周或每月)运行,您可能需要合并一个唯一索引以防止重复附加。如果您要堆叠所有这些总和,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 进行单个查询,并将类和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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-03
    • 2017-03-26
    • 1970-01-01
    • 1970-01-01
    • 2017-08-02
    • 2017-05-11
    • 1970-01-01
    • 2018-05-04
    相关资源
    最近更新 更多