2017-12-18 9 views
1

私は以下のようなカード履歴のデータセットを持っています。顧客ごとに、同じ日に1つまたは複数のカードを申請した可能性があります。しかし、いろいろな理由でカードが交換されます。カード発行日は、カード発行日である。新しいカードIDは、置き換えられたカードのIDです。たとえば、顧客Aの場合、カードは2011年2月1日に最初に発行され、カードIDは1234です。3日後、彼はカードを紛失し、2013年5月2日に新しいカード(1235)が発行されます。私が欲しいものSASでの複雑なデータ再構成問題

Customer ID First Issue Date Card Issue Date Card ID New Card ID 
A 2/1/2017 2/1/2017 1234 1235 
A 2/1/2017 5/2/2017 1235   
B 5/2/2017 5/2/2017 1245 1248 
B 5/2/2017 5/2/2017 1236 1249 
B 5/2/2017 10/3/2017 1248 1250 
B 5/2/2017 5/3/2017 1249 1251 
B 5/2/2017 10/4/2017 1250   
B 5/2/2017 5/4/2017 1251  

はグループにまとめて、元のカードとすべての代替品です。たとえば、顧客Bは5/2/217に2枚のカードを申請しました。カードID 1245,1248および1250は同じグループ(Seq No 1)にあり、カードID 1236,1249および1251は同じグループ(Seq No 2)にあります。

Customer ID Open Date Card Issue Date Card ID Seq No 
A 2/1/2017 2/1/2017 1234 1 
A 2/1/2017 5/2/2017 1235 1 
B 5/2/2017 5/2/2017 1245 1 
B 5/2/2017 10/3/2017 1248 1 
B 5/2/2017 10/4/2017 1250 1 
B 5/2/2017 5/2/2017 1236 2 
B 5/2/2017 5/3/2017 1249 2 
B 5/2/2017 5/4/2017 1251 2 

このデータ変換を手伝ってください。ここで

は、あなたが探しているもの

data test; 
infile datalines dsd truncover ; 
input Customer:$1. 
First_Issue_Date: ddmmyy10. 
Card_Issue_Date: ddmmyy10. 
Card_ID: $4. 
New_Card_ID: $4. ; 
format First_Issue_Date ddmmyy10. Card_Issue_Date ddmmyy10.; 
datalines; 
A,02/01/2017,02/01/2017,1234,1235, 
A,02/01/2017,05/02/2017,1235,, 
B,05/02/2017,05/02/2017,1245,1248, 
B,05/02/2017,05/02/2017,1236,1249, 
B,05/02/2017,10/03/2017,1248,1250, 
B,05/02/2017,05/03/2017,1249,1251, 
B,05/02/2017,10/04/2017,1250,, 
B,05/02/2017,05/04/2017,1251,, 
; 
+0

proc optnetにアクセスできない場合は、私が[ここ](https://stackoverflow.com/questions/32342750/sas-grouping-pairs/32412518#32412518)に投稿した回答を、 – user667489

答えて

1

のDATAステップのハッシュオブジェクトを作成することができますしたい1、2、...、Nを命じていますアイデンティティトラッキングされたデータのパスをトラバースするのに非常に有効です。すべてのCard_IDがすべての顧客で一意であり、各New_Card_ID値に対応するCard_ID値がデータセットにあると仮定すると、このコードは無数の再発行の間で一意のパスIDを検出します。あなたが本当にお客様の中Seq = 1..Nが必要な場合は

data paths(keep=card_id path_id); 
    if 0 then set have; * prep pdv; 

    call missing (Path_ID); 

    * for tracking the tip of the card_id trail; 
    DECLARE HASH currentCard(hashexp: 9); 
    currentCard.defineKey ('Card_ID'); 
    currentCard.defineData ('Card_ID', 'Path_ID'); 
    currentCard.defineDone(); 

    * for tracking everything up to the tip (segment); 
    DECLARE HASH replacedCard(hashexp:10); 
    replacedCard.defineKey ('New_Card_ID');  
    replacedCard.defineData('Card_ID'); 
    replacedCard.defineDone(); 

    * fill the two hashes; 
    do until (lastrow); 
    set have (keep=Card_ID New_Card_ID) end=lastrow; 

    if missing(New_Card_ID) then 
     Path_ID + 1; 

    if missing(New_Card_ID) 
     then currentCard.add(); 
     else replacedCard.add(); 
    end; 

    * for each tip of a path output the tip and all its segments; 
    declare hiter tipIter('currentCard'); 
    do while (tipIter.next() = 0); 
    output; * tip; 

    do while (replacedCard.find(key:Card_ID) = 0); 
     output; * segment; 
    end; 
    end; 

    stop; 
run; 

追加のソートとマージを行う必要があります。

私のNESUG 2009の論文"Using HASH to find a sum over a transactional path"には、リンクされた取引に関する同様の説明があります。

0

入力ファイルのデータステップである連結成分分析です。あなたがそれを持っているなら、PROC OPTNETはあなたが望むものを与えることができます。

残念ながら、BYステートメントをサポートしていないため、カードをグループ化するために使用した後にシーケンス番号を生成する必要があります。

まず、カードデータからノード "to/from"データを作成します。

data nodes; 
set test; 
node = put(_n_,best12.); 
from = card_id; 
to = new_card_id; 
if to = . then to=from; 
run; 

次に解析を実行します。

proc optnet data_links=nodes out_nodes=nodes_out; 
concomp; 
run; 

これは、カードとそのグループ(変数concomp)のリストを生成します。

このグループを元のデータに戻してソートします。

proc sql noprint; 
create table want as 
select a.customer, 
     a.First_Issue_Date, 
     a.Card_Issue_Date, 
     a.Card_ID, 
     b.concomp 
    from test as a 
     left join 
     nodes_out as b 
    on a.card_id = b.node 
    order by customer, concomp, Card_Issue_Date; 
quit; 

は今のグループは、ちょうどあなたがその情報を取るためにDataステップを使用してseq_no

data want(drop=concomp); 
set want; 
by customer concomp; 
retain seq_no ; 

if first.customer then 
    seq_no = 0; 
if first.concomp then 
    seq_no = seq_no + 1; 
run; 
+0

あなたのソリューションをありがとう。しかし、私はORパッケージを持っていません。 – Cypress

関連する問題