2016-11-16 6 views
0

SASの各パーマのrdq = adqのとき、同じID番号を持つID1変数を入力しようとしています。私のデータの例です。sasの各グループで同じ値を記入してください

permco rdq adq  ID  ID1 
     1  333 331  1  . 
     1  333 332  2  . 
     1  333 333  3  3 
     1  333 334  4  . 
     1  333 335  5  . 
     1  333 336  6  . 
     1  555 552  1  . 
     1  555 553  2  . 
     1  555 554  3  . 
     1  555 555  4  4 
     1  555 556  5  . 
     1  555 557  6  . 
     1  555 558  7  . 
     2  333 331  1  . 
     2  333 332  2  . 
     2  333 333  3  3 
     2  333 334  4  . 
     2  333 335  5  . 
     2  333 336  6  . 
     2  555 552  1  . 
     2  555 553  2  . 
     2  555 554  3  . 
     2  555 555  4  4 
     2  555 556  5  . 
     2  555 557  6  . 
     2  555 558  7  . 

そして、何私が持っていることを望むが、私はID番号際RDQ = ADQとID1に記入したいと思います...

permco rdq adq  ID  ID1 
     1  333 331  1  3 
     1  333 332  2  3 
     1  333 333  3  3 
     1  333 334  4  3 
     1  333 335  5  3 
     1  333 336  6  3 
     1  555 552  1  4 
     1  555 553  2  4 
     1  555 554  3  4 
     1  555 555  4  4 
     1  555 556  5  4 
     1  555 557  6  4 
     1  555 558  7  4 
     2  333 331  1  3 
     2  333 332  2  3 
     2  333 333  3  3 
     2  333 334  4  3 
     2  333 335  5  3 
     2  333 336  6  3 
     2  555 552  1  4 
     2  555 553  2  4 
     2  555 554  3  4 
     2  555 555  4  4 
     2  555 556  5  4 
     2  555 557  6  4 
     2  555 558  7  4 

です。

+0

それぞれのpermcoまたは各rdq? – Leo

+0

この質問は非常によく似ています。同じ種類のアプローチがここで動作します: http://stackoverflow.com/questions/40570322/keeping-or-deleting-a-group-of-observations-based-on-a-characteristic -of-a-by-gr/40575015#40575015 – user667489

答えて

1

ダブルダウループソリューション:

data have01; 
infile cards truncover expandtabs; 
input permco rdq adq  ID  ID1 ; 
cards; 
     1  333 331  1  . 
     1  333 332  2  . 
     1  333 333  3  3 
     1  333 334  4  . 
     1  333 333  5  5 
     1  333 336  6  . 
     1  555 552  1  . 
     1  555 553  2  . 
     1  555 554  3  . 
     1  555 555  4  4 
     1  555 556  5  . 
     1  555 557  6  . 
     1  555 558  7  . 
     2  333 331  1  . 
     2  333 332  2  . 
     2  333 333  3  3 
     2  333 334  4  . 
     2  333 335  5  . 
     2  333 336  6  . 
     2  555 552  1  . 
     2  555 553  2  . 
     2  555 554  3  . 
     2  555 555  4  . 
     2  555 556  5  . 
     2  555 557  6  . 
     2  555 558  7  . 
; 
run; 

data want; 
do _n_ = 1 by 1 until (last.rdq); 
    set have01; 
    by permco rdq; 
    if first.rdq then call missing(ID1); 
    if adq = rdq then t_ID1 = ID1; 
    drop t_ID1; 
end; 
do _n_ = 1 to _n_; 
    set have01; 
    ID1 = t_ID1; 
    output; 
end; 
run; 

これがあれば、複数の一致があることを前提としてい、最後のものが優先されます。一致するものがない場合、そのグループのすべての行は欠損値を取得します。

0

あなたのデータはあなたがID 1の一意の値を持っていて、その組み合わせのためにのためにを通じて同じ値を入力する必要がPermcoとRDQの組み合わせのためのようである場合:

代替することができます:

  • パーマ、RDQ、 ID1の3つの列のみを持つ別々のデータセットを作成し、空白のID1を持つ行を削除します。
  • パルコとRDQの入力データをこのデータとマージします。

    中間データ; set input_data(パルコRDQ ID1を保持); ID1 =の場合。次に削除します。 実行;入力データの入力=入力データ1(ドロップID1);パルコRDQ;実行;

    procソートデータ=中間;パルコRDQ;実行;

    data final; merge input_data_1(in = a)中間(in = b); Permco RDQによる ; if a; 実行;

0

permcoとrdqで定義されたby-group内で同じ番号を使用したいとします。グループごとに2つ以上の一致がある可能性は、可変の一致perpergroupで処理されます。 1つのグループに一致するものが見つからない場合、id1は欠損値です。

data have01; 
infile cards truncover expandtabs; 
input permco rdq adq  ID  ID1 ; 
cards; 
     1  333 331  1  . 
     1  333 332  2  . 
     1  333 333  3  3 
     1  333 334  4  . 
     1  333 333  5  5 
     1  333 336  6  . 
     1  555 552  1  . 
     1  555 553  2  . 
     1  555 554  3  . 
     1  555 555  4  4 
     1  555 556  5  . 
     1  555 557  6  . 
     1  555 558  7  . 
     2  333 331  1  . 
     2  333 332  2  . 
     2  333 333  3  3 
     2  333 334  4  . 
     2  333 335  5  . 
     2  333 336  6  . 
     2  555 552  1  . 
     2  555 553  2  . 
     2  555 554  3  . 
     2  555 555  4  4 
     2  555 556  5  . 
     2  555 557  6  . 
     2  555 558  7  . 
run; 


data want(drop=rv); 
if 0 then set have01; 
if _N_=1 then 
    do; 
     declare hash hh(dataset:"have01(where=(adq=rdq))",ordered:'A',multidata:'Y'); 
     hh.definekey('permco','rdq'); 
     hh.definedata('id1'); 
     hh.definedone(); 
    end; 
do until(theend); 
    set have01 end=theend; 
    rv = hh.find(); 
    hh.has_next(result: matchespergroup); 
    if rv=0 then do; matchespergroup+1; output;end; 
    else do; id1 = .;output;end; 
end; 
run; 
+0

これは '** rdq = adq'を使って各グループ内に**正確に** 1つの行がある場合にのみ意図どおりに動作します。この条件に一致する行数が異なる1つのグループ別にも、ループの後続のすべての反復が、最初のセットの文と同期しなくなります。 – user667489

+0

真。その可能性を含めるために自分の投稿を更新しました。 –

+0

by-groupに一致する行がない場合はどうなりますか? – user667489

0

ここではループは不要です。あなたがする必要があるすべてはあなたが各グループに必要な値を見つけて、元のデータセットに戻ってそれをマージです:

proc sql; 
    create table temp as select distinct 
     permco, rdq, id 
     from have (where = (rdq = adq)); 
quit; 

proc sql; 
    create table want as select distinct 
     a.*, b.id as id_filled 
     from have as a 
     left join temp as b 
     on a.permco = b.permco and a.rdq = b.rdq; 
quit; 
関連する問題