2016-11-24 10 views
-3

以下の条件で新しい変数WHLDRを作成する必要があります。私は最後のものが正しいかどうかわからない。したがって、rel = 0かつref_1 = 1の場合、multi> 1かつref_1 = 0の場合、whldr = 0でなければこの条件を満たす最初のIDはwhldr = 1であり、続行されます。これは私のコードとサンプルのデータです。ここで最初の関数を使用する

data temp_all; 
    merge temp_1 (in=inA) 
     temp_2 (in=inB) 
     temp_3 (in=inC) 
    ; 
    by id; 
    firstid=first.id; 

    if multi = 1 then do; 
    if rel = 0 then whldr=1; 
    else whldr = 0; 
    end; 

    else if multi > 1 and ref_1 >= 1 then do; 
    if rel =0 and ref_1=1 then whldr=1; 
    else whldr = 0; 
    end; 

    else if multi > 1 and ref_1 = 0 then do; 
    if rel =0 and ref_1=1 then do; 
     if rel =0 and ref_0 ne '0' then do; 
     if first.id=1 then whldr=1 ; 
     else whldr=0; 
     end; 
    end; 
    end; 
run; 

はサンプルデータです:あなたはWHLDRという名前の変数を持っていて、それが値1を持つ最初の観測をしたい場合は

data have ; 
    input id a rel b multi ; 
cards; 
105 . 0 0 1 
110 1 0 1 1 
110 0 1 1 1 
110 . 2 1 1 
113 1 0 1 1 
113 2 1 1 1 
113 0 2 1 1 
113 0 2 1 1 
135 1 0 1 1 
135 0 1 1 1 
176 1 0 1 1 
176 0 1 1 1 
189 1 0 1 1 
189 2 1 1 1 
189 0 4 1 1 
189 0 4 1 1 
; 
+1

詳しくは、説明してください。例えば、あなたはどのように人を定義していますか?データセット全体の中で最初の人が欲しいですか?または状態のような他のグループ化変数内にありますか?入力例と結果データの例は、あなたが望むものを明確にするのに役立ちます。 – Tom

+0

これは私のコードです。人は誰ですか、私は最後の条件を満たすデータセット全体の中で最初の人を欲しいです。私は人のレベルのデータを持っており、その条件を満たす最初の人(B)を取得しようとしています。その結果は家計レベルのデータセットになります。 – user601828

+0

複雑なif/then構造を評価して、それが正しいかどうかを調べることはできません。しかし、あなたが望む観測結果にフラグを立てるならば、おそらく、出力結果セットを得るために 'output;'と 'stop;'ステートメントを追加するだけでよいでしょう。 – Tom

答えて

1

は、次のようなデータのステップを実行することができます。

data want ; 
    set have (obs=1); 
    where whldr=1 ; 
run; 
+0

if then else文の条件に基づいて変数WHLDRを作成しています。したがって、WHLDRは3つの条件に基づいて1または0の値を取得します。 – user601828

+0

最初のレコードは最初のIDです。したがって、上記の入力データセットでは、id 103に3つのレコードがあるため、最初のレコードは、上記のコードの最後のelse ifブロックの条件を満たす場合はwhldr = 1になります。 – user601828

+0

あなたは113を意味しましたか?ネストされたIFステートメントを持つ方法は、サンプルレコードのどれもがすべてがMULTI = 1であるため、FIRST.IDフラグをチェックするコード行に到達できないことに注意してください。 – Tom

関連する問題