为一系列日期创建新列,然后根据每一行的开始日期和结束日期之间的那一天填充 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 转置。
我发现这有点难以解释我的意思,所以为了清楚起见,我添加了输入的 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 转置。