sas - 按组划分的 SAS 中的日期差异

标签 sas

考虑一个数据集 test 形式如下:

 Group   Date
  1      05JAN2014
  1      08JAN2014
  1      14JAN2014
  2      05JAN2013
  2      10FEB2015
  2      27FEB2015

我想根据组计算日期的差异。下面的代码采用每两个日期之间的差异:
  data test;
  datediff = dif(Date);
  run;

我如何只计算一组日期之间的差异?此外,有没有办法在每个组中的最后一个日期和第一个日期之间进行区分?

最佳答案

从这个开始:

 data test;
  datediff = dif(Date);
  run;

让我们一次解决您的问题。首先,添加一个set声明和 by声明,我们还可以添加 firstlast允许您确定您在组中的位置。这假设它已经排序 by group .
data test2;
  set test;
  by group;
  datediff=dif(date);
run;

这并没有什么不同(假设你最初有 set 语句,无论如何)。但是现在,您有了一些新的选择。

首先,虽然您可以使用 dif ,我推荐retain为此的方法。你可以更容易地看到它在做什么,并避免一些常见的陷阱:特别是,lagdif实际上并不与之前的记录进行比较 - 他们创建一个队列并与之比较,这可能会导致使用条件语句时的复杂性。
data test2;
  set test;
  by group;
  retain last_date;
  if first.group then last_date=0;
  datediff = date - last_date;
  output;
  last_date = date;
run;

这与之前的操作相同 - 将之前的值与当前值进行比较 - 但更容易查看,我们添加了一个选项来重置 last_date变量当 first.group是真的 - 意味着我们在组的新值的第一行。我不会删除任何这些中间变量,但在生产代码中你可以而且应该。 retain意味着该值将跨行保持(而不是在每次获得新行时重置)。

现在您有一个变量跟踪前一行的值 date ,很容易希望看到我们如何也可以为第一个->最后一个差异做到这一点。
data test2;
  set test;
  by group;
  retain last_date orig_date;
  if first.group then do;
    last_date=0;
    orig_date=date;  **new;
  end;
  datediff = date - last_date; 
  if last.group then group_datediff = date-orig_date;  **new;
  output;
  last_date = date;
run;

现在我们做了和以前一样的事情——但是每次看到 first.group 时我们都会重置 orig_date并在我们点击 last.group 时计算 group_datediff .

关于sas - 按组划分的 SAS 中的日期差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29946640/

相关文章:

vba - SAS - 如何屏蔽双引号(例如 "")

sql - PROC SQL 返回的行顺序

SAS:比较两个数据集,但需要从一组数据中删除额外的观察结果

sas - 如何编写标题中包含格式化日期和格式化列的 Excel 文件?

SAS %while 循环条件未正确评估

date - SAS 特定日期格式

r - SAS 中的 "auto.arima"?

sas - 使用 PRXPARSE 和 PRXSUBSTR 提取字符串片段

arrays - SAS 数组 : How to get sum, 数组子集的最大值、最小值

sql - 在 SAS SQL 情况下计算不同值