我有一个大型数据集可以解析为以下内容:
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需要不同的滞后量。
有没有人知道如何解决这个问题?
提前致谢!
答案 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;