一旦多个变量满足条件,便丢弃观测值

问题描述 投票:0回答:2

我有以下数据,并使用现有的已回答问题之一来解决我的数据问题,但无法获得我想要的。这是我的数据中的内容

  • 当Evt_type为Fee时填充Amt1
  • 当Evt_type为REF1 / REF2时填充Amt2
  • 我不想在最后一个Flag ='Y'之后显示任何观察结果
  • 如果没有Flag ='Y',那么我想要该id的所有观测值(例如id = 102)

有:

       id   Date        Evt_Type   Flag   Amt1   Amt2
      101  2/2/2019      Fee              5
      101  2/3/2019      REF1      Y             5
      101  2/4/2019      Fee              10
      101  2/6/2019      REF2      Y             10
      101  2/7/2019      Fee               4
      102  2/2/2019      Fee              25
      102  2/2/2019      REF1      N      25

想要:

      id   Date        Evt_Type   Flag   Amt1   Amt2
     101  2/2/2019      Fee              5
     101  2/3/2019      REF1      Y             5
     101  2/4/2019      Fee              10
     101  2/6/2019      REF2      Y             10
     102  2/2/2019      Fee              25
     102  2/2/2019      REF1      N      25

我尝试了以下内容

data want;
    set have;
    by id Date;
    drop count;

    if (first.id or first.date) and FLAG='Y' then
        do;
            retain count;
            count=1;
            output;
            return;
        end;

    if count=1 and ((first.id or first.date) and Flag ne 'Y') then
        do;
            retain count;
            delete;
            return;
        end;
    output;
run;

感谢您的任何帮助。

谢谢

sas delete-row retain
2个回答
0
投票

一种称为DOW循环]的技术可以执行以某种方式测量组的计算,然后在第二个循环中将该计算应用于组的成员。

DOW依赖于循环内的SET语句。在这种情况下,计算是“组中的哪一行是具有flag="Y"的最后一行。

data want;
  * DOW loop, contains computation;

  _max_n_with_Y = 1e12;

  do _n_ = 1 by 1 until (last.id);
    set have;
    by id;
    if flag='Y' then _max_n_with_Y = _n_;
  end;

  * Follow up loop, applies computation;
  do _n_ = 1 to _n_;
    set have;
    if _n_ <= _max_n_with_Y then OUTPUT;
  end;
  drop _:;
run;

0
投票

这里是一种方式

© www.soinside.com 2019 - 2024. All rights reserved.