为一系列日期创建新列,然后根据每一行的开始日期和结束日期之间的那一天填充 1 或 0

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

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

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

假设我有以下 table:

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

我希望将这些数据汇总成几个 tables,每个属性(Property1,Property2)一个,在一段时间内(比如 2018 年 10 月 1 日至 5 日)的每一天都有一列2018 年 10 月),然后他们每天对归因于每个可用 属性 值的“有效”项目总数求和。

所以我想要的输出是:

和:

在 excel 中,我会通过在我感兴趣的时间段内的每一天向 table 添加一个新列来分解它,然后根据以下条件用 1 或 0 填充它那天是否在开始和结束日期(含)之内。然后对每个 属性.

求和

在 excel 中,我将通过以下方式进行 table:

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

我是 SAS 的新手,所以我想知道是否有办法使用 SAS 获得这些结果?

在这种情况下,我发现首先完全扩展数据,然后根据需要进行总结是很有用的。因此,我将从创建一个每天包含一条记录的数据集开始:

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 转置。