2017-07-31 202 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;