2016-11-19 24 views
-1

私は多対多マージから3つのデータセットを作成しています。私は、それが他のデータセットとマッチするように、チーム変数をデータセットの1つに作成するためにプレーヤー変数からチーム名を選択する必要があることを知っています(または、ランク付けで行うことはできますか? )。しかし、この変数を同じデータセットに作成すると、これをマージする必要があります。 プレーヤー変数の例としては、 "Jamal San Quentin、Kentucky St." 私はKentucky St.(これは他のデータセットの "Name"です)と一致させるために、Kentucky St.パート(私はデリミタでスキャン機能を考えています)を抽出する必要があります。私は "名前"を "チーム"に改名し、他のセットの変数 "プレーヤー"から "チーム"を作成しています。しかし、私は...1対1の大きなデータステップでの多対多のマージ

data wpa.ALLDATA work.TeamData work.NoRunners; 
    length team $20; 
    Team = scan(Player,2,','); 
    merge downl.runners (in=r) downl.offences (in=o rename=(name=Team) 
    drop=ties); 
    by Team; 
    if r and o then output work.TeamData; 
    else if o and not r then output work.NoRunners; 
    else if o or r then output wpa.ALLDATA; 
run; 

ALLDATAは136を持っている必要があり、Teamdataは100を持っている必要があり、すべてが一緒に動作するように見えることはできませんとnorunnersは36私の問題は、セットがちょうど」上がらないということである必要があります変数を使ってチームをソートして実行した後でも、チームに基づいてマージします。

+0

入力データセットと出力データセットからいくつかのサンプル行を入力してください。 – user667489

+0

基本セットからいくつかの観察があります。 – AvdotyaC

+2

テキストとして投稿してください。 – user667489

答えて

2

MERGEを使用するには、変数が入力データステップに存在する必要があります。マージは、SCAN()のようなユーザの文が動作する前に行われます。

data team_runners ; 
    set runners; 
    length team $20; 
    team = left(scan(player,2,',')); 
    player = scan(player,1,','); 
run; 
proc sort data=team_runners ; 
    by team player; 
run; 

今、あなたは新しいTEAM変数によって、既存のOFFENCESで新しいTEAM_RUNNERSテーブルをマージすることができます。

実際のマージは多対多マージではありません。あなたのチーム/選手テーブルのレコードは、あなたのチームの攻撃テーブルの1つのレコードにのみ一致します。結果を3つのグループ、つまりマッチ、比類のない選手、比類のないチームに分けることができます。すべてのレコードを含む表を含めるには、条件付きでないOUTPUT文を使用します。

data allrecords matches noteam noplayers ; 
    merge team_players(in=in1) offences(in=in2); 
    by team; 
    output allrecords; 
    if in1 and in2 then output matches; 
    else if in1 then output noteam ; 
    else output noplayers; 
run; 
+0

トム、もう一度助けてくれてありがとう。そのほとんどは働いています。しかし、データセットへの出力を選択する際には、136個の観測値を持つデータセットが必要です(直接一致ではなく、両方のデータセットの観測値があります)。これは私に0の観測値を持つノートラムデータセットを与えます。どうすればそれを変更できますか?データはalldata norunnersと一致します。 merge team_runners(in = in1)犯行(in = in2);チームによる ; in1とin2の場合は一致します。 else in2で、in1でない場合、出力norun; else if1またはin2が出力alldataよりも大きい場合。 実行; – AvdotyaC

+0

私は理解していませんが、その3番目のグループをin1とin2以外のものにしたい場合はELSEを削除する必要があります。実際には、3つのグループのすべての仕様が完了しているので、両方のELSEキーワードを削除してください。 IF(in1またはin2)はすべてのレコードであるため、IF文は必要ありません。ただの出力を使用してください。 – Tom

+0

^それは計画のように聞こえる。助けてくれてありがとう、Tom。 – AvdotyaC

1

もっと効率的な方法があるかもしれません。このソリューションは、ハッシュオブジェクトとハッシュイテレータを使用します。 2つのデータステップを実行し、最初にプレイヤー名からチーム名を分離し、2番目のステップで行ったように処理を進めることができます。以下はすべて一度に行います。

data runners; 
length Team $16.; 
input Team $ Var1 Var2; 
datalines; 
Name1,TeamName1 1 2 
Name2,TeamName2 1 3 
Name1,TeamName3 2 4 
Name2,TeamName4 2 4 
Name2,TeamName5 2 4 
; 
run; 

data offences; 
length Name $10.; 
input Name $ Var3 Var4; 
datalines; 
TeamName1 1 2 
TeamName2 1 3 
TeamName3 2 4 
TeamName4 2 4 
TeamName6 2 4 
; 
run; 


data ALLDATA TeamData NoRunners (drop=rc); 
if 0 then set runners; 
if _N_ =1 then 
do; 
    declare hash hh(ordered:'A'); 
    declare hiter hi('hh'); 
    hh.definekey('Team'); 
    hh.definedata('Team','Var1','Var2','Name'); 
    hh.definedone(); 
end; 

do while(not theend); 
    set runners (rename=(Team=TeamName)) end=theend; 
    Team = prxchange("s/^(.+),//",-1,TeamName); 
    Name = prxchange("s/,(.+)$//",-1,TeamName); 
    hh.ref(); 
    drop TeamName; 
end; 

do while(not last); 
    set offences (rename=(Name=Team)) end=last; 
    rc= hh.find(); 

    if rc =0 then do; 
      output TeamData ALLDATA; 
      hh.remove(); 
     end; 
    else do; 
     call missing(Var1,Var2,Name); 
     output NoRunners ALLDATA; 
    end; 
end; 

rc = hi.first(); 
do while(rc=0); 
    output ALLDATA; 
    rc = hi.next(); 
end; 
stop; 
run; 
+0

私はこれを理解しておらず、以前はハッシュオブジェクトやハッシュイテレータを見たことがありません。理想的には、並べ替えと名前の変更を使用することができますが、データを1つまたは2つだけでシンプルに保つことができます。あなたは明らかに言語についてかなりよく知っていますが、私にとっては少し速いです。 – AvdotyaC

+0

それから、Tomが提供したソリューションがおそらくあなたにとって最適です。変数teamは、マージする前にファイルに存在しなければなりません。 SASは観測による観測を処理し、データセットのすべての行でループします。また、入力ファイルの変数を操作する前に、データセット(入力、マージ、...)の入力を定義する必要があります。私はあなたが1つのデータセットでそれを望んだと思った。結局、投稿のタイトルはそれを示唆しています...:D –

+0

あなたの素晴らしいと深い解決に感謝します。 :) – AvdotyaC