2017-07-31 108 views
0

我有以下示例数据集,其中包含ID和6个月内的合同状态(01/2017 - 06/2017)。SAS跨多个变量的比较值

实施例的数据:

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是“不能够重新激活”。

欲检查两个样的变化:从状态5更改为6 2)的ID当状态变化从5至6我希望有一个新的,其改变从6至5

1)的ID变量“churn”包含状态更改为6的月份。 对于第二组,我想要一个新变量“reactivation”,其中包含状态更改为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; 

在此先感谢!

+1

你到目前为止尝试过什么?请将您的数据发布为文字而不是图片,否则您会要求人们输入数据并解决您的问题。 – Reeza

+0

您需要为6列声明一个数组,当条件满足时,使用'vname'函数获取正确的变量名称。正如Reeza所建议的那样,如果你遇到困难,我会很乐意为你提供进一步的帮助,但前提是你走得更远。 –

+0

感谢您的提示,这是我在这里的第一篇文章,只是使用了截图工具。我将数据行添加为文本和目前为止的代码。 – Jayque86

回答

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 - 月。这将避免需要一个数组,并允许您捕获多个搅拌/重新激活。一般来说,使用高瘦数据而不是短宽数据更容易。例如,很容易计算每个ID处于活动状态的月数。

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; 

run;