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

Sas 一旦多个变量满足条件,则丢弃观测值,sas,delete-row,retain,Sas,Delete Row,Retain,我有以下数据,并使用其中一个现有的回答问题来解决我的数据问题,但无法得到我想要的。以下是我的数据 当Evt_类型为“费用”时,将填充Amt1 当Evt_类型为REF1/REF2时,将填充Amt2 我不想在最后一个标志class='Y'后显示任何观察结果 如果没有Flag='Y',则我需要该id的所有观察值(例如id=102) 我想显示该id的下一行是否是在flag='Y'(例如id=101)后加上REF1/REF2的费用,但是如果没有REF1/REF2(例如id=103),我不想显示。 拥有

我有以下数据,并使用其中一个现有的回答问题来解决我的数据问题,但无法得到我想要的。以下是我的数据

  • 当Evt_类型为“费用”时,将填充Amt1
  • 当Evt_类型为REF1/REF2时,将填充Amt2
  • 我不想在最后一个标志class='Y'后显示任何观察结果
  • 如果没有Flag='Y',则我需要该id的所有观察值(例如id=102)
  • 我想显示该id的下一行是否是在flag='Y'(例如id=101)后加上REF1/REF2的费用,但是如果没有REF1/REF2(例如id=103),我不想显示。
拥有:

想要:

我尝试了以下方法

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;
感谢您的帮助

多亏了

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

道琼斯指数依赖于循环内的
SET
语句。在这种情况下,计算结果是“组中最后一行具有
flag=“Y”

需要数据;
*道循环,包含计算;
_最大值(Y=1e12);
do _n_=1乘以1直到(last.id);
集有;
按身份证;
如果flag='Y',则_max\u n\u与_Y=\u n\u;
结束;
*跟踪循环,应用计算;
do _n_=1至_n_;
集有;
如果这里有一种方法

data have;
input id $ Date : mmddyy10. Evt_Type $ Flag $ Amt1 Amt2;
format Date mmddyy10.;
infile datalines dsd missover;
datalines;
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,
;

data want;
   do _N_ = 1 by 1 until (last.id);
      set have;
      by id;
      if flag = "Y" then _iorc_ = _N_;
   end;

   do _N_ = 1 to _N_;
      set have;
      if _N_ le _iorc_ then output;
   end;
   _iorc_=1e7;
run;

@ckp,如果你想要更多关于道琼斯指数循环的细节(即使它只是它的代表),那么一篇好的论文就是。嗨,理查德。感谢您的帮助和有关道指的详细信息。你能帮我补充一下我加粗的额外要求吗。提前谢谢。与其用答案把现有的问题复杂化,我建议提出一个新问题,说明它是这个问题的延伸。在这个问题中,重点放在数据上,特别是如果您希望在组中最后一个Y的行后面有0、1或2行,以及每个行的示例,用所需的分类标记原始行。
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;
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;
data have;
input id $ Date : mmddyy10. Evt_Type $ Flag $ Amt1 Amt2;
format Date mmddyy10.;
infile datalines dsd missover;
datalines;
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,
;

data want;
   do _N_ = 1 by 1 until (last.id);
      set have;
      by id;
      if flag = "Y" then _iorc_ = _N_;
   end;

   do _N_ = 1 to _N_;
      set have;
      if _N_ le _iorc_ then output;
   end;
   _iorc_=1e7;
run;