SAS:提取以前和以后的观察结果

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不存在”

我有这样一个数据集(类型是一个指标):

我试图用类型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不存在”


有人能帮我吗?Thx

另一篇文章中的X数据集与您正在筛选的源表相同,因此代码的逻辑顺序为:

  • 检查表“Have”中的每一行,
    \u N\u
    保存当前行号
  • 如果Type=1,则
    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