SAS向后保留

时间:2016-01-20 17:22:52

标签: sas

我有一个大型数据集可以解析为以下内容:

ID  x
1   0
1   0
1   0
1   1
1   1

我有一个ID变量告诉我X值对应哪个人。

如果此个人未发生任何事件,则X变量为0,如果发生事件,则为1。

我有兴趣创建一个变量,告诉我在特定ID的整个时间序列中,客户是否发生过任何事件,如下面的X2所示。

ID  x   x2
1   0   1
1   0   1
1   0   1
1   1   1
1   1   1

因此,x2在所有观察值中取值1,因为x在至少一个实例中取值为1。

我已经看过通过“SAS领先技术”创建一个反向滞后但它似乎无法保留该值,因此我需要多次执行反向滞后,这不是一个选项,因为我的实际数据集包含数千行,每个ID需要不同的滞后量。

有没有人知道如何解决这个问题?

提前致谢!

3 个答案:

答案 0 :(得分:2)

尝试SQL解决方案。

proc sql;
create table flagged as 
select
  a.*,
  b.x2
from
  table  a
  join
  (select 
    id,
    max(x) as x2
  from table
  group by id)  b
    on
    a.id = b.id
;
quit;

答案 1 :(得分:2)

最简单的方法是双DoW循环。

data want;
  do _n_ = 1 by 1 until (last.id);
    set have;
    by id;
    if x then x2=1;
  end;
  do _n_ = 1 by 1 until (last.id);
    set have;
    by id;
    output;
  end;
run;

这循环遍历数据集一次以找到x2的值,设置它,然后再次循环以输出数据。您实际上并不是retain任何事情,因为它只针对单个ID进行了一次数据步骤循环迭代 - x2除了ID之外不会被重置。

这个速度相当快,只要你没有比你可以放入读缓冲区更多的每个ID记录,因为它将缓冲第一次读取,因此不必再从磁盘重新读取时间。

答案 2 :(得分:1)

您可以通过将数据与自身合并,将where=数据集选项应用于第二个副本来完成此操作。您需要保留X变量的副本,但需要重命名,以便可以在where=中使用。您可以将此重命名的变量用作新的X2,但是您需要将缺失转换为零。或者您可以使用IN=数据集选项生成具有0/1值的新X2变量。

data want;
  merge have have(in=in2 keep=id x rename=(x=x3) where=(x3=1)) ;
  by id;
  x2 = in2;
  drop x3;
run;