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;