SAS中的下一个值组

时间:2017-09-06 14:55:09

标签: group-by sas

我正在尝试创建一个新变量,它接受组中的下一个值。特别是,我有:

User   Quarter
 A     2012Q1
 A     2012Q2
 A     2012Q3

我想要的输出是:

User   Quarter  Next_Quarter
 A     2012Q1    2012Q2
 A     2012Q2    2012Q3
 A     2012Q3     n/a

我曾尝试为每位顾客提供一个柜台,但我不确定应该从哪里开始......

2 个答案:

答案 0 :(得分:0)

在数据步骤中没有一种简单的方法可以展望。您可以做的是颠倒顺序,使用滞后函数来获取值,并重新排序。

data have;
input User $  Quarter $;
datalines;
A     2012Q1
A     2012Q2
A     2012Q3
B     2012Q1
B     2012Q2
B     2012Q3
;

/*Reverse the order*/
proc sort data=have;
by user descending quarter;
run;

/*Use Lag() to get the previous value (next since we reversed it)*/
data want;
set have;
by user;

tmp = lag(quarter);

if ^first.user then
    Next_Quarter = tmp;
else
    Next_Quarter = "n/a";

drop tmp;
run;

/*Re-sort to the proper order*/
proc sort data=want;
by user quarter;
run;

答案 1 :(得分:0)

您可以使用FIRSTOBS=2的额外SET语句来“向前看”。确保考虑任何BY组。

data want ;
  set have end=eof ;
  by user;
  if not eof then set have(keep=Quarter rename=(Quarter=Next_Quarter) firstobs=2) ;
  if last.user then call missing(Next_Quarter);
run;

如果您没有BY组,请将最后一个IF更改为

  if eof then call missing(Next_Quarter);