2016-12-05 2 views
1

特定の値よりも小さい合計を持つSASデータセットに列をドロップしたいとします。以下のケースを考えてみましょう。SASを使用した値の合計に基づく変数のドロップ

Column_A Pred_1 Pred_2 Pred_3 Pred_4 Pred_5 
A    1  1  0  1  0 
A    0  1  0  1  0 
A    0  1  0  1  0 
A    0  1  0  1  1 
A    0  1  0  0  1 

私たちは私たちのしきい値が4であると仮定しましょう、私は4未満有効観測値の合計値を持つ予測因子をドロップしたいので、出力は

Column_A Pred_2 Pred_4 
A    1  1 
A    1  1 
A    1  1 
A    1  1 
A    1  0 

のようになります。現在、私は非常に使用しています複数の転置を使用して予測子を削除する非効率的な方法。レコードが30,000を超える複数のデータセットがあるため、転置アプローチには時間がかかります。誰かがより効率的なソリューションを持っている場合、感謝します!

ありがとうございます!

答えて

0

は、あなたができるように思える:

  1. 実行PROC MEANSまたは類似procが合計を取得するために
  2. は、これらの変数をドロップthreshhold合計<とデータセット内のすべての変数を含むマクロ変数を作成します

次に、TRANSPOSEまたはそれ以外のものは、通常の普通の要約とドロップだけです。なお、がPROC MEANSではないODS OUTPUTを使用する必要があります。そうでない場合は、PROC MEANSOUT=データセットをPROC TRANSPOSEにする必要があります。

些細なデータセットを使用した例:

data have; 
    array x[20]; 
    do _n_ = 1 to 20; 
    do _i = 1 to dim(x); 
     x[_i] = rand('Uniform') < 0.2; 
    end; 
    output; 
    end; 
run; 

ods output summary=have_sums; *how we get our output; 
ods html select none;   *stop it from going to results window; 
proc means data=have stackodsoutput sum; *stackodsoutput is 9.3+ I believe; 
    var x1-x20; 
run; 
ods html select all;   *reenable normal html output; 

%let threshhold=4;    *your threshhold value; 

proc sql; 
    select variable 
    into :droplist_threshhold separated by ' ' 
    from have_sums 
    where sum lt &threshhold; *checking if sum is over threshhold; 
quit; 

data want; 
    set have; 
    drop &droplist_threshhold.; *and now, drop them!; 
run; 
+0

このコメントをいただきありがとうございます。私はEGでこれを実行し、proc手段を実行するとこのエラーが発生します。 エラー:HTML宛先がアクティブではありません。選択/除外リストは利用できません。 考えますか? –

+0

'oss htmlを削除することができます – Joe

+0

' ODS HTML'行を削除することができます。それらは画面への出力を減らすためだけです。 – Joe

0

だけの合計を取得するためにPROC SUMMARYを使用しています。その後、データステップを使用して、ドロップする変数名のリストを生成することができます。

%let threshhold=4; 
%let varlist= pred_1 - pred_5; 

proc summary data=have ; 
    var &varlist ; 
    output out=sum sum= ; 
run; 

data _null_; 
    set sum ; 
    array x &varlist ; 
    length droplist $500 ; 
    do i=1 to dim(x); 
    if x(i) < &threshhold then droplist=catx(' ',droplist,vname(x(i))); 
    end; 
    call symputx('droplist',droplist); 
run; 

はその後、DROP文またはDROP=データセットオプションを生成するために、マクロ変数を使用することができます。

drop &droplist; 
関連する問題