2016-05-31 7 views
0

追加のレコードではなく、追加の変数で重複したIDレコードに関する情報を保持するフラットファイルを受け取りました。例えばSAS - 変数の内容とバリエーションの比較

、以下のデータセット:あなたが見ることができるように

ResID VarA_1 VarA_2 VarA_3 VarB_1 VarB_2 VarB_3 
XAB2 Red  Ylw  Blu  13  13  13 
BGH3 Grn      14 
FHT1 Prp      13 

、ID「XAB2」に関連したすべての変数が一つのレコードにフラット化された:

ResID VarA VarB 
XAB2 Red 13 
XAB2 Ylw 13 
BGH3 Grn 14 
FHT1 Prp 13 
XAB2 Blu 13 

ガットは、このになりましたしたがって、すべての情報を保持することができますが、データセットは依然として個人レベルのファイルとして扱うことができます。

これはクールです。しかし、今私はdupsの間の不一致を和解する必要があります。

私は現在のように、/それ以外の場合はif文データステップで非常に退屈なのシリーズを書くことを計画:私はDUPのが住んでいる内の変数をフラグが立てられたら

 if VarA_2 NE " " and VarA_2 EQ VarA_1 then FLAG_VarA_dup = 0; 
else if VarA_2 NE " " and VarA_2 NE VarA_1 then FLAG_VarA_dup = 1; 
else if VarA_3 NE " " and VarA_3 EQ VarA_2 then FLAG_VarA_dup = 0; 
else if VarA_3 NE " " and VarA_3 NE VarA_2 then FLAG_VarA_dup = 1; 

/*...etc. for all VarB occurrences, and all other variables in my very wide DS*/ 

、その後、私は比較することができます関連する変数を把握し、何を保持するか、より深く掘り下げるかを決定します。しかし、私は助けることはできませんが、これを行うためにははるかにエレガントで効率的な方法があると思います。私はここで事を学ぶのが大好きです。

もっと良い解決策がありますか?

答えて

2

VarA_#に最初の値以外の値があるかどうかを知りたい場合は、とcountwを使用して確認することができます。基本的には、SASにVarA_#を1つの文字列に設定し、選択した区切り文字で区切ってからtranwrdを使用して、最初の変数の値のすべてのコピーを欠落に変換します。残りの文字列の単語数を数えます - 0は最初の値のみを意味し、1以上はいくつかの異なる値を意味します。

data have; 
    infile datalines truncover; 
    input ResID $ VarA_1 $ VarA_2 $ VarA_3 $ VarB_1 VarB_2 VarB_3; 
datalines; 
XAB2 Red  Ylw  Blu  13  13  13 
BGH3 Grn  Grn  .   14  14 
FHT1 Prp  .  .   13 
;;;; 
run; 

data want; 
    set have; 
    array varA_[3]; 
    count_a = countw(catx(' ',of varA_[*])); 
    count_a_diff = countw(tranwrd(catx(' ',of VarA_[*]),trim(varA_1),' ')); 
run; 
+1

単語の一部が一致しないようにするには、TRANWRD()関数呼び出しの両方の引数に区切り文字を追加する必要があります。 TRANWRD()はその名前にもかかわらず、何の言葉がわからない。 – Tom

+1

@Tomデータの部分的な単語のマッチングが可能な場合は、良い点です。私はあなたがそうしたいと思うならば、その答えの中でそれに対処するつもりはありません、あなた自身の答えで(または上で)自由に感じてください。 – Joe

関連する問題