SAS:提取上一次和下一次观察

时间:2018-05-02 21:39:55

标签: sas window extract next

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

 datetime         type
 ...
 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
 ...

我试图用类型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
...

我发现了一篇类似的帖子here。我复制并粘贴了代码,但我不太确定' x'他的代码意味着什么。 SAS给了我' File WORK.x不存在'。

有人可以帮帮我吗?谢谢。

3 个答案:

答案 0 :(得分:3)

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

  1. 检查表格中的每一行'有',onmousewheel包含当前行号,
  2. 如果Type = 1,则_N_会转到' Have'中的行Set Have Point=_N_。表和输出到新表的行'想要'然后继续到下一行。 _N_可以是指向当前行,上一行或下一行的指针。 (两个IF语句处理第一行和最后一行的情况;其中没有上一个或没有下一个)
  3. 完整工作守则:

    _N_

    注意:我添加了额外的步骤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; 以删除重复的行。

    输出:

    proc sort

答案 1 :(得分:0)

移动下一个观察并比较同一行的两个观察结果或使用滞后来比较当前观察结果和之前的观察结果。

router.post("/item/add", middleware.isLoggedIn, (req, res) => {
  User.findById(req.user._id, (err, user) => {
    upload(req, res, err => {
      if (err) {
        req.flash("error", "failed to upload file");
        return res.redirect("/products");
      }
      var item = new Item();
      item.name = req.body.name;
      item.description = req.body.description;
      item.price = req.body.price;
      item.createdBy = { id: req.user._id, username: req.user.username };
      if (typeof req.file === undefined) {
        item.image = "/uploads/no-img.png";
      } else {
        item.image = "/uploads/" + req.file.filename;
      }
      item.save(function(err) {
        if (err) {
          res.send(err);
        }
        return res.redirect("/products");
      });
    });
  });
});

答案 2 :(得分:0)

对于没有任何id或group变量的示例数据,它应该非常简单。不要考虑在文件中来回移动,只需创建包含LAG_TYPE的先前(LEAD_TYPE)和下一个(TYPE)值的新变量。然后,您需要在TYPE = 1之前保留观察结果,以保持观察结果LEAD_TYPE = 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