考虑一个数据集 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
声明,我们还可以添加 first
和 last
允许您确定您在组中的位置。这假设它已经排序 by group
.data test2;
set test;
by group;
datediff=dif(date);
run;
这并没有什么不同(假设你最初有 set 语句,无论如何)。但是现在,您有了一些新的选择。
首先,虽然您可以使用
dif
,我推荐retain
为此的方法。你可以更容易地看到它在做什么,并避免一些常见的陷阱:特别是,lag
和 dif
实际上并不与之前的记录进行比较 - 他们创建一个队列并与之比较,这可能会导致使用条件语句时的复杂性。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/