SAS - 计算累计访问量

时间:2014-05-13 13:38:18

标签: sql sas counting proc cumulative-sum

我们遇到的问题是人们没有及时提交医院访问信息。我试图破解访问日期后(平均)医院将提交该日期所有访问的信息。

尝试从当前数据集创建一个包含3个相关字段的表:Unique_Visiting_ID,Visit_Date,Date_Created,Chief_Complaint。

可以有多个行具有相同的unique_visiting_ID,unique_visiting_id是单个患者访问的唯一标识符。 Visit_date是访问日期。 date_created变量告诉我们向我们发送一行的日期。

我想要创建的表格中的列是:访问后的天数(0-14)以及特定日期报告的平均访问次数

对于第二栏,我想知道:     如果我在visit_date后0天限制创建日期,那么在访问日期会发生多少次访问(使用非null的chief_complaint)?

如果我将创建的日期限制在visit_date后的0或1天,那么访问日期会发生多少次访问(使用非null的chief_complaint)?

如果我将date_created限制为visit_date后的0,1或2天,那么在该访问日期发生了多少次访问(使用非null的chief_complaint)?

等等,直到你访问_date后的1-14天。

有什么想法吗?我从这开始,我知道这是错的,但不知道如何解决它......

1 个答案:

答案 0 :(得分:1)

据我所知,你真的想要制作两张表:

  • 所有访问的列表,包含提交/创建之前的天数 每个

  • 所有日期的列表,包含每个日期的访问次数,包括在

  • 后0-14天提交的次数

如果这就是你的意思,这个宏应该可以解决问题。 dsn_in是原始数据集的名称。 dsn_out_days是保存第一个项目符号点结果的数据集的名称。 dsn_out_summary是保存第二个项目符号点结果的数据集的名称。

%MACRO do_analysis (dsn_in = , dsn_out_days = , dsn_visits_by_date = );
    %LOCAL i ; 

    DATA &dsn_out_days;
        SET &dsn_in;

        days_after_visit = INTCK ('DAYS', Visit_Date, Date_Created);

        %DO i = 0 %TO 14;
            submitted_up_to_&i._days_after = (days_after_visit <= &i);
            LABEL submitted_up_to_&i._days_after = "Submitted Up To &i Days After" ;
        %END;
    RUN;

    PROC SUMMARY NWAY DATA = &dsn_out_days (
        WHERE = ( NOT MISSING (Chief_Complaint) )
    );
        CLASS Visit_Date;

        OUTPUT 
            OUT = &dsn_visits_by_date (
                DROP = _TYPE_
                RENAME = (_FREQ_ = total_visits) 
            )
            SUM (
                %DO i = 0 %TO 14;
                    submitted_up_to_&i._days_after 
                %END;
            ) =
        ;
    RUN;

    /* Comment out this data step to see how everything works under the hood */
    DATA &dsn_out_days;
        SET &dsn_out_days (
            DROP = 
                %DO i = 0 %TO 14;
                    submitted_up_to_&i._days_after 
                %END;
        );
    RUN;

    DATA &dsn_visits_by_date;
        SET &dsn_visits_by_date ;

        LABEL total_visits = "Total Visits";
    RUN;

    PROC SORT DATA = &dsn_visits_by_date ;
        BY Visit_Date ;
    RUN; 
%MEND;

请注意,%DO宏用法可以减少打字的苦差事:

submitted_up_to_1_days_after = (days_after_visit <= 1);
submitted_up_to_2_days_after = (days_after_visit <= 2);
submitted_up_to_3_days_after = (days_after_visit <= 3);
. . . .

但如果您更喜欢无宏解决方案,我可以编辑。请告诉我。