【问题标题】:How to compare cross values on different columns SAS?如何比较不同列SAS的交叉值?
【发布时间】:2021-12-07 16:04:10
【问题描述】:

我正在尝试比较不同日期列上的交叉值。标志列有两个值:D 和 R。我的条件是当 D-Flag 出现在 R-flag 之后并且 DATE2 等于 DATE1 创建名为 False_Flag 的列并附加 1,否则按 ID 附加 0。

这是我的表的示例:

在 ID=1 时,第一行的 DATE2 等于第二列的 DATE1,并且 D 标志位于 R 标志之后,因此我想创建名为 False_flag 的新列并针对这种情况追加 1。与 ID =3 相同,其他情况 like ID = 5 为 False_flag 附加 0


ID     DATE1        DATE2      FLAG 

1      10JUN2021    17JUN2021   R
1      17JUN2021    25SEP2021   D
3      12MAR2018    25MAR2018   R
3      25MAR2018    14APR2018   D
3      14APR2018    23JUL2018   D      
5      22OCT2020    15NOV2020   D


这是我想要的输出:

ID     DATE1        DATE2      FLAG  FALSE_FLAG

1      10JUN2021    17JUN2021   R      1
1      17JUN2021    25SEP2021   D      1
3      12MAR2018    25MAR2018   R      1
3      25MAR2018    14APR2018   D      1
3      14APR2018    23JUL2018   D      0
5      22OCT2020    15NOV2020   D      0  

我是 SAS 的新手,我该怎么做?

【问题讨论】:

  • 我不懂逻辑。在您已经移动到带有“D”的下一行之后,您是否真的需要返回并修改带有“R”的行? SAS 看不到未来,但可以学会记住过去。

标签: sas


【解决方案1】:

我们可以这样做。

  • 首先,我们必须按特定顺序对数据进行排序
  • 因为我们会查看后续记录以获得输出
  • 很遗憾,SAS 中没有 LEAD 函数来获取下一行的值
  • 因此我们将以相反的顺序对其进行排序,然后使用 LAG 函数将其恢复为我们想要的实际顺序

以下代码将以相反的顺序对数据进行排序 (descending)

Proc sort data=inp;
by descending id descending date1 descending date2 descending flag;
run;

然后使用LAG函数查找下一行的date1和flag

Data lead_tbl;
set inp;
format lag_dt date9.;
lag_dt = lag(date1);   /* --> Next row's date 1*/
lag_flg = lag(flag);   /* --> Next row's flag*/
run;

接下来,我们会将其排序回我们想要的原始顺序。注意 - 此步骤至关重要,因为此顺序决定结果。

Proc sort data=lead_tbl;
by id date1 date2 descending flag;  /* --> Descending flag is used to order it like R and D */
run;

最后,使用完美排序的lead_tbl 表创建false_flag

/* Keep will just keep those columns */
data results(keep=id date1 date2 flag false_flag);
set lead_tbl;
by id;
retain pre_flag;

/* Checking if the row meets the criteria */
IF (first.id) and (date2 = lag_dt) and (flag='R') and (lag_flg='D') then do
    false_flag = 1;
    pre_flag = flag; 
end;

/* To update the second row for same id */
else if flag= 'D' and pre_flag = 'R' then do;
    false_flag = 1;
    pre_flag= flag;
end;

/* If record does not meet the criteria */
else do
    false_flag=0;
end;
run;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-08
    • 1970-01-01
    • 1970-01-01
    • 2019-08-30
    • 1970-01-01
    相关资源
    最近更新 更多