【问题标题】:Creating new columns for a range of days and then filling with 1 or 0 based on that day falling between a start and end date of each row为一系列日期创建新列,然后根据每一行的开始日期和结束日期之间的那一天填充 1 或 0
【发布时间】:2021-07-04 13:43:52
【问题描述】:

我发现这有点难以解释我的意思,所以为了清楚起见,我添加了我所拥有的输入和我所追求的输出的表格的图像。

基本上,我有一个 SAS 数据集,其中包含(在与不同属性对应的其他列中)两列:开始日期和结束日期。

假设我有下表:

如果某一天在连续项目的开始和结束日期(包括)内,则该项目将在当天“生效”。因此,从 2018 年 1 月 1 日到 2018 年 10 月 3 日,UniqueID 6 每天都“生效”。

我希望将这些数据汇总到几个表格中,一个用于每个属性(Property1、Property2),其中每个属性在一段时间内(例如 2018 年 10 月 1 日至 2018 年 10 月 5 日)的每一天都有一个列,然后是每个属性他们将归因于每个可用属性值的“有效”项目的总数相加。

所以我想要的输出是:

和:

在 excel 中,我会通过在我感兴趣的时间段内的每一天向表中添加一个新列来分解这一点,然后根据该天是否在开始日期和结束日期内填写 1 或 0 (包括的)。然后对每个属性求和。

在 excel 中,我将通过制作下表:

我正在尝试使用 SAS,因为它是一个相当大的数据集。

我对 SAS 很陌生,所以我很想知道是否有办法使用 SAS 获得这些结果?

【问题讨论】:

  • 当然,在 SAS 中有一种方法可以做到这一点,但如果您将数据发布为文本而不是图像,这将非常有帮助。请参阅此处有关如何提出问题的指南How to Ask

标签: sas


【解决方案1】:

在这种情况下,我发现先完全扩展数据,然后根据需要进行汇总很有用。所以我会先创建一个每天有一条记录的数据集:

data prelim (drop=uniqueid startdate enddate);
  set have;
  do day = startdate to enddate; output; end;
run;

然后,您可以根据需要使用多种技术来汇总数据。我将从(使用更简单易懂的版本)开始:

proc freq data=prelim noprint;
  tables property1 * day /out=property1_day (keep=property1 day count);
run;

proc sort data=property1_day;
  by property1;

proc transpose data=property1_day out=property1_summary (keep=property1 day:);
  by property1;
  id day;
  var count;
run;

这应该可以帮助您完成大部分工作 - 您可能希望将缺失值重置为零(我确信可以使用 COMPLETETYPES 或类似选项),但我很少使用 proc transpose。

【讨论】:

    猜你喜欢
    • 2021-08-22
    • 2018-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多