【问题标题】:SAS - remove lines from a file based on in-between period from another fileSAS - 根据另一个文件的中间时段从文件中删除行
【发布时间】:2016-07-22 20:43:34
【问题描述】:

我有以下两个数据集。 我想从 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,他的第一个 obs 属于 01JAN04-04JAN04,因此我删除了那个 obs,但保留了其余的。

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

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?

对于如何解决这个问题,我将不胜感激。 谢谢!

【问题讨论】:

    标签: sas data-manipulation


    【解决方案1】:

    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;
    

    【讨论】:

    • 非常优雅的解决方案!谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-11
    • 2011-06-14
    • 1970-01-01
    • 2019-03-10
    • 1970-01-01
    • 2012-07-07
    • 2020-03-21
    相关资源
    最近更新 更多