我有以下示例数据集,其中包含ID和合同状态,为期六个月(2017年1月1日至6月6日)。
示例数据:
ID Month1 Month2 Month3 Month4 Month5 Month6**
12 5 5 5 5 5 5
34 5 5 6 6 5 5
56 6 6 6 -7 -7 -7
78 6 6 5 5 5 5
12 5 5 5 5 6 -7
如果状态为5,则ID处于活动状态,如果6已取消,则-7为"无法重新激活"。
我想检查两种变化: 1)ID从状态5变为6 2)ID从6变为5
当状态从5变为6时,我想要一个新变量" churn"包含状态更改为6的月份。 对于第二组,我想要一个新变量"重新激活"包含状态更改为5的月份。 如果ID在两个组中(从5到6到5),则应填充两个变量。
到目前为止我所拥有的是一个数组,它显示了一行中有多少状态匹配,但我没有进行下一步。这是代码:
data want (drop= i j);
set have (obs=100);
array stat_check {*} month1-month6;
sum=0;
do i=1 to dim(stat_check)-1;
do j=i+1 to dim(stat_check);
sum=sum(sum,stat_check(i) eq stat_check(j));
end;
end;
run;
提前致谢!
答案 0 :(得分:0)
对于数组方法,听起来需要将数组中的每个变量与之前的变量进行比较。你不需要通过阵列两次,只有一次。您想比较month2到month1,month3到month2 ... month6到month5。
我会尝试像(未经测试的):
data want (drop= month);
set have (obs=100);
array stat_check {*} month1-month6;
sum=0;
do month=2 to dim(stat_check);
if stat_check{month}-stat_check{month-1} = 1 then Churn=month;
else if stat_check{month}-stat_check{month-1} = -1 then Reactivation =month;
end;
run;
如果您可以为同一ID进行多次搅拌或多次重新激活,则会捕获最新的流失或重新激活。
但老实说,我会将数据转换为每个ID月一行。这样可以避免使用数组,并允许您捕获多个churns /重新激活。通常,使用较高的瘦数据而不是较短的宽数据更容易。例如,可以很容易地计算每个ID处于活动状态的月数。
答案 1 :(得分:0)
你可以尝试这个。 vname函数用于获取变量名称(月份)
data two (drop= i j);
set one;
array stat_check {*} m1-m6;
sum=0;
do i=1 to dim(stat_check)-1;
do j=i+1 to dim(stat_check);
sum=stat_check(i)-stat_check(j);
if sum=1 then churn=vname(stat_check(i));
if sum=-1 then reactivation=vname(stat_check(i));
end;
end;
运行;