SAS - 根据另一个文件的中间期间从文件中删除行

时间:2016-07-22 20:43:35

标签: sas data-manipulation

我有以下两个数据集。 我想删除A中的行,其中日期属于文件B中的输入输出期间。

档案A

SEQ ID  date    var1
1   A12 03JAN04 242
2   A12 01FEB06 356
3   A12 06JAN08 325
4   A12 28DEC09 123
5   B34 06MAY03 985
6   B34 13JUN03 198
7   B34 10MAY05 241
8   C56 09NOV10 155
9   C56 19OCT13 352

文件B

ID  date_in date_out
A12 01JAN04 04JAN04
A12 05FEB08 08FEB08
B34 03MAY03 06MAY03
B34 09MAY05 19MAY05
C56 12JUL12 18JUL12

例如,对于ID = A12,他的第一个障碍物落在01JAN04-04JAN04内,因此我删除了那个障碍物,但保留其余部分。

基本上,我应该得到以下结果

SEQ ID  date    var1
2   A12 01FEB06 356
3   A12 06JAN08 325
4   A12 28DEC09 123
6   B34 13JUN03 198
8   C56 09NOV10 155
9   C56 19OCT13 352

文件A和B每个ID都有多个记录,文件B中的输入输出时间间隔不是恒定的。

我认为在R中,我可能通过A中的行写一个循环,从B中列出与ID匹配的列表,然后循环遍历B中的句点列表,看看A中的日期是否属于中间的周期。

但是我需要在SAS中这样做,所以我真的不知道从哪里开始。我如何在SAS中逐行循环? 例如。我应该写一个循环遍历两个文件的宏如何?或以某种方式使用SQL?

我非常感谢有关如何解决这个问题的一些建议。 谢谢!

1 个答案:

答案 0 :(得分:2)

PROC SQL很容易解决这个问题......

proc sql;
  create table bad_seqs as
    select A.SEQ
      from A
      left join B
             on A.ID = B.ID
      where A.date between B.date_in and B.date_out;

  delete from A where SEQ in (select SEQ from bad_seqs);
quit;