2017-07-31 19 views
0

IDと契約ステータスが6ヶ月(01/2017 - 06/2017)の次のサンプルデータセットがあります。複数の変数の値を比較

例データ:

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であれば、それはキャンセルと-7「再活性化することはできない」ですよ6あればIDは、アクティブです。 5から6へのステータス変更は、私は新しいが欲しいときは6から5

に変更6 2)IDに状態5から変更 1)のID:

私は変化の2種類を確認したいです2番目のグループについては、状態が5に変わる月を含む新しい変数「再アクティブ化」が必要です。 IDが両方のグループにある場合(from 5から6から5まで)両方の変数を埋める必要があります。

私がこれまで持っていたのは、1行にいくつのステータスが一致するかを示す配列ですが、次のステップはありません。コードは次のとおりです。

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

アレイアプローチの場合、配列内の各変数とその直前の変数を比較する必要があるように思えます。アレイを2回通過する必要はなく、1つだけです。あなたはmonth2をmonth1、month3をmonth2 ... month6とmonth5と比較したいと思う。あなたは、最新の解約または再活性化をキャプチャするのと同じIDに対して複数の大量生産で有名または複数の再活性化を、持っていることができれば

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-月あたり1つの行を持つようにデータを転置します。これは配列の必要性を避け、複数のチャーン/再アクティブ化をキャプチャできるようにします。一般に、短いワイドデータではなく、背の高いスキニーデータで作業する方が簡単です。例えば、各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; 

実行します。

関連する問題