我有这样一个数据集(SP是一个指标):
datetime sp
ddmmyy:10:30:00 N
ddmmyy:10:31:00 N
ddmmyy:10:32:00 Y
ddmmyy:10:33:00 N
ddmmyy:10:34:00 N
我想用“Y”,也是一个和下一个一个来提取意见:
ID sp
ddmmyy:10:31:00 N
ddmmyy:10:32:00 Y
ddmmyy:10:33:00 N
我累了用“滞后”,并成功提取出与“Y”和下一个观测,但仍没有关于如何提取以前的一个想法。
这里是我的尝试:
data surprise_6_step3; set surprise_6_step2;
length lag_sp $1;
lag_sp=lag(sp);
if sp='N' and lag(sp)='N' then delete;
run;
其结果是:
ID sp
ddmmyy:10:32:00 Y
ddmmyy:10:33:00 N
任何方法提取先前的观测也? THX的任何帮助。
尝试使用point
选项set
语句数据的步骤。 像这样:
data extract;
set surprise_6_step2 nobs=nobs;
if sp = 'Y' then do;
current = _N_;
prev = current - 1;
next = current + 1;
if prev > 0 then do;
set x point = prev;
output;
end;
set x point = current;
output;
if next <= nobs then do;
set x point = next;
output;
end;
end;
run;
有通过数据集中implicite循环,当你在使用它set
语句。 _N_
是包含关于什么的观察是在(开始从1)implicite环路信息的自动变量。 当你发现你的价值,你的价值存储_N_
到可变current
,所以你知道哪一行,你发现它。 nobs
是在数据集中观察的总数。
检查是否prev
是大于0,如果next
是小于nobs
,如果你的行是第一个数据集中的避免了错误(当时没有以前行),如果你的行是最后一个数据集(那么有没有下一行) 。
/* generate test data */
data test;
do dt = 1 to 100;
sp = ifc( rand("uniform") > 0.75, "Y", "N" );
output;
end;
run;
proc sql;
create table test2 as
select *,
monotonic() as _n
from test
;
create table test3 ( drop= _n ) as
select a.*
from test2 as a
full join test2 as b
on a._n = b._n + 1
full join test2 as c
on a._n = c._n - 1
where a.sp = "Y"
or b.sp = "Y"
or c.sp = "Y"
;
quit;