SAS:提取以前和以后的观察结果
我有这样一个数据集(类型是一个指标): 我试图用类型1以及上一个和下一个来提取数据。只需尝试根据类型1提取(-1,+1)窗口SAS:提取以前和以后的观察结果,sas,window,extract,next,Sas,Window,Extract,Next,我有这样一个数据集(类型是一个指标): 我试图用类型1以及上一个和下一个来提取数据。只需尝试根据类型1提取(-1,+1)窗口 datetime type ... ddmmyy:10:31:00 0 ddmmyy:10:32:00 1 ddmmyy:10:33:00 0 ddmmyy:10:34:00 1 ddmmyy:10:35:00 0 ... 我发现了一个类似的帖子。我复制并粘贴了代码,但我不太确定“x”在他的代码中是什么意思。SAS给我“文件WORK.x不存在”
datetime type
...
ddmmyy:10:31:00 0
ddmmyy:10:32:00 1
ddmmyy:10:33:00 0
ddmmyy:10:34:00 1
ddmmyy:10:35:00 0
...
我发现了一个类似的帖子。我复制并粘贴了代码,但我不太确定“x”在他的代码中是什么意思。SAS给我“文件WORK.x不存在”
有人能帮我吗?Thx 另一篇文章中的X数据集与您正在筛选的源表相同,因此代码的逻辑顺序为:
\u N\u
保存当前行号Set Have Point=\u N
转到“Have”表中的行\u N
,并将该行输出到新表“want”,然后继续到下一行。可以是指向当前行、上一行或下一行的指针。(两个IF语句处理第一行和最后一行的情况;其中没有上一行或下一行)
data have;
length datetime $23.;
input datetime $ type ;
datalines;
ddmmyy:10:30:00 0
ddmmyy:10:31:00 0
ddmmyy:10:32:00 1
ddmmyy:10:33:00 0
ddmmyy:10:34:00 1
ddmmyy:10:35:00 0
;
run;
data want;
set have nobs=nobs;
if type = 1 then do;
current = _N_;
prev = current - 1;
next = current + 1;
if prev > 0 then do;
set have point = prev;
output;
end;
set have point = current;
output;
if next <= nobs then do;
set have point = next;
output;
end;
end;
run;
proc sort data=want noduprecs;
by _all_ ; Run;
向上移动下一个观测值并比较同一行的两个观测值,或使用lag比较当前观测值和上一个观测值
data have;
length datetime $23.;
input datetime $ type ;
datalines;
ddmmyy:10:30:00 0
ddmmyy:10:31:00 0
ddmmyy:10:32:00 1
ddmmyy:10:33:00 0
ddmmyy:10:34:00 1
ddmmyy:10:35:00 0
;
run;
data want;
merge have have(firstobs=2 keep=type rename=(type=_type));
if max(type,_type) or max(type,lag(type)) ;
drop _type;
run;
例如,没有任何id或组变量的数据应该非常简单。不要考虑在文件中来回移动,只需创建包含
类型
的上一个(滞后类型
)和下一个(超前类型
)值的新变量。然后,在类型为1的观察之前保留观察的要求被转化为在LEAD_类型为1的情况下保留观察
让我们将示例数据转换为数据集
data have ;
input datetime :$15. type ;
cards;
ddmmyy:10:30:00 0
ddmmyy:10:31:00 0
ddmmyy:10:32:00 1
ddmmyy:10:33:00 0
ddmmyy:10:34:00 1
ddmmyy:10:35:00 0
;
我将创建一个新变量KEEP,而不是实际保留所需的观察值,该变量对于满足您的条件的记录将为真
data want ;
recno+1;
set have end=eof;
lag_type=lag(type);
if not eof then set have(firstobs=2 keep=type rename=(type=lead_type));
else lead_type=.;
keep= (type=1 or lag_type=1 or lead_type=1) ;
run;
结果如下
recno datetime type lag_type lead_type keep
1 ddmmyy:10:30:00 0 . 0 0
2 ddmmyy:10:31:00 0 0 1 1
3 ddmmyy:10:32:00 1 0 0 1
4 ddmmyy:10:33:00 0 1 1 1
5 ddmmyy:10:34:00 1 0 0 1
6 ddmmyy:10:35:00 0 1 . 1
have
(或链接中的x
)在示例代码中用作输入数据集的占位符。例如,如果我试图给你这个问题的代码,我将不得不使用这个技巧,因为你没有在你的问题中说明输入数据集的名称。
data want ;
recno+1;
set have end=eof;
lag_type=lag(type);
if not eof then set have(firstobs=2 keep=type rename=(type=lead_type));
else lead_type=.;
keep= (type=1 or lag_type=1 or lead_type=1) ;
run;
recno datetime type lag_type lead_type keep
1 ddmmyy:10:30:00 0 . 0 0
2 ddmmyy:10:31:00 0 0 1 1
3 ddmmyy:10:32:00 1 0 0 1
4 ddmmyy:10:33:00 0 1 1 1
5 ddmmyy:10:34:00 1 0 0 1
6 ddmmyy:10:35:00 0 1 . 1