2017-04-25 56 views
3

私は変数で繰り返されているが、不等な行数の2つのデータセットを一緒にマージしたい。 SASでは、デフォルトの動作として、一致しないすべての行の値が保持されます。例えば多対多のSASマージで一致するものがない場合、どのようにして保持された値を不足に設定しますか?

data a; 
    input i x y; 
    datalines; 
     1 1 5 
     1 2 6 
     1 3 7 
     1 4 8 
     ; 
run; 

data b; 
    input i f g $; 
    datalines; 
     1 9 aa 
     1 8 bb 
     ; 
run; 

ここセットaセットb 2つだけを有している、可変iによって4つの行を有します。変数iによると、単にマージ

はこれを生成します。

data c; 
    merge a b; 
    by i; 
run; 

Obs i x y f g 
1  1 1 5 9 aa 
2  1 2 6 8 bb 
3  1 3 7 8 bb 
4  1 4 8 8 bb 

あなたは、彼らがデータセットの試合を持っていなかったので、変数fg OBS 3と4の値が保持されていることがわかりますa。私が作るしようとしています何

は、この出力されます:

Obs i x y f g 
1  1 1 5 9 aa 
2  1 2 6 8 bb 
3  1 3 7 .  
4  1 4 8 .  

私はSAS 9.4を使用していますが、これは私が試したものです:

data c; 
    if _n_>1 then do; 
     array num{*} _numeric_; 
     array char{*} _character_; 
     call missing(of num{*}); 
     call missing(of char{*}); 
     end; 
    merge a b; 
    by i; 
run; 

私の考えはすべてのためにということです行の最初の後に、すべての変数を欠落に設定したいので、一致する行がない場合は値が上書きされずに失われてしまいます。これにより、保持された値が削除されます。

二行目ではPDVを作成する必要があり、すべてのメタデータがこれらの配列を作成し、行方不明にそれらを設定するために利用可能でなければならないが、私はこのエラーを取得しています:修正する方法について

WARNING: Defining an array with zero elements.

任意の提案このコードまたはトリックを行う他のコード?

答えて

3

runステートメントのデフォルトの動作、つまり特定の変数の自動出力および自動呼び出しが無効になるようにしたいとします。

ここでoutput;は(mergeまたはset文に表示されないだけのものではなく)行方不明にすべての変数を設定しますcall missing(of _all_);(デフォルトの動作と同じ)、その後、自動出力を強制します。

data c; 
    merge a b; 
    by i; 
    output; 
    call missing(of _all_); 
run; 

あなたが最後にそれをしなければならないとない始まりは、あなたが最初にまだ変数を定義していないということである理由 - そう_numeric__character_、または_all_はを参照してくださいには何もありません。

if 0 then set a b;でこれを修正できますが、上記の解決方法はもう少し簡単です。本当にうまく動作し、同じ速度と利点を持っています。

data c; 
    if 0 then set a b; *defines all of the variables, but `if 0` means it will not pull any data; 
    call missing(of _all_); *sets everything missing; 
    merge a b; 
    by i; 
run; 
関連する問題