我有一个像这样的数据集(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
提取先前观察的任何方法也? 感谢任何帮助。
答案 0 :(得分:5)
尝试在数据步骤中使用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;
在set
语句中使用数据集时,有一个隐含的循环数据集。
_N_
是一个自动变量,包含有关哪些观察是隐含循环的信息(从1开始)。当您找到值时,将_N_
的值存储到变量current
中,以便知道您在哪一行找到它。 nobs
是数据集中的观察总数。
检查prev
是否大于0,如果next
小于nobs
,如果您的行在数据集中的第一行(那么没有前一行),则{{1}}可以避免错误你的行在数据集中是最后一行(然后没有下一行)。