【问题标题】:SAS - counting cumulative visits reportedSAS - 计算报告的累计访问次数
【发布时间】:2014-05-13 13:38:17
【问题描述】:

我们遇到了人们未及时提交医院就诊信息的问题。我试图了解医院会在访问日期后多长时间(平均)提交该日期发生的所有访问的信息。

尝试从具有 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 天,那么在该访问日期发生了多少次访问(具有非空的 Chief_complaint)?

等等,直到您在访问日期后 1-14 天。

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

【问题讨论】:

  • 澄清一下,之所以会有多行具有相同的Unique_Visiting_ID 是因为多次投诉,对吗?也就是说,任何具有相同Unique_Visiting_ID 的两行也具有相同的Visit_Date 和相同的Date_created,但Chief_Complaint 的值不同?
  • 不——我在这里只包含了 4 个字段,因为它们是唯一的 4 个相关字段;实际上,我有 64 个变量,医院可以在任何字段中发送具有不同值的更新,但 unique_visiting_id 将使它们保持在一起。话虽如此,unique_visiting_ID 和 visit_date 将保持不变,但 date_created(发送行的日期)可以更改,因为有些信息可以在第一天发送,然后可以在第二天更新。这有意义吗?

标签: sql sas counting proc cumulative-sum


【解决方案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);
. . . .

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

【讨论】:

  • 谢谢!宏对我来说很有意义,所以它很好;现在下班了,明天试试这个。非常感谢!!
  • 嗨...我很好奇,它有用吗?如果没有,我可以尝试一些其他的东西。
  • 对不起,很久以前忘了告诉你这行得通。非常感谢!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-26
  • 1970-01-01
相关资源
最近更新 更多