我有一个像这样的数据集(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
Run Code Online (Sandbox Code Playgroud)
我想用"Y"以及前一个和下一个来提取观察结果:
ID sp
ddmmyy:10:31:00 N
ddmmyy:10:32:00 Y
ddmmyy:10:33:00 N
Run Code Online (Sandbox Code Playgroud)
我厌倦了使用"滞后"并成功地用"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;
Run Code Online (Sandbox Code Playgroud)
结果是:
ID sp
ddmmyy:10:32:00 Y
ddmmyy:10:33:00 N
Run Code Online (Sandbox Code Playgroud)
提取先前观察的任何方法也?感谢任何帮助.
尝试在数据步骤中使用语句中的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;
Run Code Online (Sandbox Code Playgroud)
在set语句中使用数据集时,有一个隐含的循环数据集.
_N_是一个自动变量,包含有关哪些观察是隐含循环的信息(从1开始).找到值后,将值存储_N_到变量中,current以便知道在哪一行找到它.nobs是数据集中的观察总数.
检查if prev是否大于0且if next是否小于那么nobs如果您的行在数据集中是第一个(然后没有前一行)并且您的行在数据集中是最后一行(那么没有下一行)则会避免错误.