SAS - 比较组内的观察值以选择值
SAS - Comparing observations within a group to pick values
我的 SAS 数据集中有 4 列,如下面第一张图片所示。我需要按 ID 比较连续行的日期。对于每个 ID,如果 Date2 出现在同一 ID 的下一行的 Date1 之前,则保留账单金额。如果 Date2 出现在下一行的 Date1 之后,则删除账单金额。因此,对于每个 ID,只保留 Date2 小于下一行 Date1 的账单。我已将结果集的外观放在底部。
结果集应该如下所示
您需要创建一个新变量,将下一行的 DATE1 向上移动一行以进行比较。假设您的日期变量采用日期格式,请使用 PROC EXPAND
并进行比较,确保您不会比较最后一个缺少 LEAD 值的值:
DATA TEST;
INPUT ID: . DATE1: MMDDYY10. DATE2: MMDDYY10. BILL: 8.;
FORMAT DATE1 DATE2 MMDDYY10.;
DATALINES;
AA 07/23/2015 07/31/2015 34
AA 07/30/2015 08/10/2015 50
AA 08/12/2015 08/15/2015 18
BB 07/23/2015 07/24/2015 20
BB 07/30/2015 08/08/2015 20
BB 08/06/2015 08/08/2015 20
;
RUN;
PROC EXPAND DATA = TEST OUT=TEST1 METHOD=NONE;
BY ID;
CONVERT DATE1 = DATE1_LEAD / TRANSFORMOUT=(LEAD 1);
RUN;
DATA TEST2; SET TEST1;
IF DATE1_LEAD NE . AND DATE2 GT DATE1_LEAD THEN BILL=.;
RUN;
如果您对数据进行排序以便查看以前的观测值来比较您的日期,则可以在数据步骤中使用 LAG Function。
我的 SAS 数据集中有 4 列,如下面第一张图片所示。我需要按 ID 比较连续行的日期。对于每个 ID,如果 Date2 出现在同一 ID 的下一行的 Date1 之前,则保留账单金额。如果 Date2 出现在下一行的 Date1 之后,则删除账单金额。因此,对于每个 ID,只保留 Date2 小于下一行 Date1 的账单。我已将结果集的外观放在底部。
结果集应该如下所示
您需要创建一个新变量,将下一行的 DATE1 向上移动一行以进行比较。假设您的日期变量采用日期格式,请使用 PROC EXPAND
并进行比较,确保您不会比较最后一个缺少 LEAD 值的值:
DATA TEST;
INPUT ID: . DATE1: MMDDYY10. DATE2: MMDDYY10. BILL: 8.;
FORMAT DATE1 DATE2 MMDDYY10.;
DATALINES;
AA 07/23/2015 07/31/2015 34
AA 07/30/2015 08/10/2015 50
AA 08/12/2015 08/15/2015 18
BB 07/23/2015 07/24/2015 20
BB 07/30/2015 08/08/2015 20
BB 08/06/2015 08/08/2015 20
;
RUN;
PROC EXPAND DATA = TEST OUT=TEST1 METHOD=NONE;
BY ID;
CONVERT DATE1 = DATE1_LEAD / TRANSFORMOUT=(LEAD 1);
RUN;
DATA TEST2; SET TEST1;
IF DATE1_LEAD NE . AND DATE2 GT DATE1_LEAD THEN BILL=.;
RUN;
如果您对数据进行排序以便查看以前的观测值来比较您的日期,则可以在数据步骤中使用 LAG Function。