2016-05-31 24 views
1

私はPython/R/StataのバックグラウンドからSASに来ています。私はこれらの言語の1つの観点から、次の問題に近づいています。おそらくSASは私がやりたいことには達していません。forループを使用してSASのデータセットに列を追加する

パネルデータセットにageという列があります。このage列を使用して、データセットに新しい列を追加します。私はageの機能を単純化し、私の例では単純にしておきます。

目的は、シーケンスをループし、各ループステップでそのシーケンスの値を使用して1.新しい列の名前を割り当て、2.その列の値を割り当てます。新しい列は、それが値spline1spline2を取るに追加して、以前のバージョンでは、私はそれを得ることができたけれども、私は、

data somePath.FinalDataset; 

    do i = 1 to 7; 

     if i = 1 then 
     spline&i. = age; 

     if i ^= 1 then spline&i. = age + i; 

    end; 
    set somePath.StartingDataset; 
    run; 

spline7は、このコードも実行されません...、私の出発データセットを得ることを望みました新しい列の値は1行下にシフトしていなければなりませんでした。私はこのコードブロックを、私がやろうとしていることの擬似コードとして含めます。どんな助けもありがとうございます

+0

ループオーバーする予定はありますか?列数(7)は固定か動的か私は配列が必要だと思う。 – Reeza

+1

あなたがしたいことを理解できるように、入力データと出力データの例を投稿する必要があります。最初の明らかな問題は、データを読み取る前にデータを操作しようとしていることです。 SETステートメントを他のステートメントの上に移動すると、コードを操作するためのAGEの値がいくつかあります。 – Tom

答えて

4

SASでこれを行う方法の1つはアレイです。 SASアレイを使用して変数のグループを参照し、変数を作成することもできます。

data have; 
    input age; 
    cards; 
    5 
    10 
; 
run; 

data want; 
    set have; 
    array spline{7}; *create spline1 spline2 ... spline7; 
    do i=1 to 7; 
    if i = 1 then spline{i} = age; 
    else spline{i} = age + i; 
    end; 
    drop i; 
run; 

Spline {i}はsplineという配列のi番目の変数を参照します。
iは通常の変数です.DROP文は出力データセットに書き込まれないようにします。

新しい列が「シフトされた」と言うとき、spline1 = ageとspline2 = age + 2に注意してください。それに応じてコードを変更することができます。 spline2 = age + 1が必要な場合は、elseステートメントをelse spline{i} = age + i - 1 ;に変更することもできます。配列ステートメントを変更して、1ではなく下限として0を定義することもできます。

+0

私はおそらくこの答えでは、SASアレイが他のプログラミング言語の配列とは少し異なっていることを言及しています(ただ単に変数のグループであり、別個の変数/オブジェクトではありません)。 – Joe

+0

@Joeこの情報を追加するために編集してください(私は知的にコメントするために他の言語については十分に分かりません: – Quentin

+0

ビンゴ)これは問題を解決します。ありがとうございます – JPErwin

0

配列は可能性が高いこれを解決するために、私はいくつかのケースで必要なマクロアプローチを実証します。

SASは、データ処理言語とデータ書き込み言語を「データステップ言語」と「マクロ言語」に分けています。実行段階(データの行が処理されている間)でデータステップ言語が実行されている間は、マクロ言語はコンパイル段階(データが処理される前)で実行されるため、

いずれにしても、このようなことをするためには、あなたが望むことをするためのマクロを書くことが可能です。 Quentinの一般的な構造と初期データセットを借用する:

data have; 
    input age; 
    cards; 
    5 
    10 
; 
run; 

%macro make_spline(var=, count=); 
    %local i; 
    %do i = 1 %to &count; 
    %if &i=1 %then &var.&i. = &var.; 
    %else &var.&i. = &var. + &i.; 
    ; *this semicolon ends the assignment statement; 
    %end; 

    /* You end up with the IF statement generating: 
     age1 = age 
    and the extra semicolon after the if/else generates the ; for that line, making it 
     age1 = age; 
    etc. for the other lines. 
    */ 
%mend make_spline; 


data want; 
    set have; 
    %make_spline(var=age,count=7); 
run; 

これは、あなたが実行しようとしているものを実行します。ルーピングはデータ言語ではなく、マクロ言語で行われます。あなたは合っていると思われるが、パラメータを割り当てることができる。私は上記のようなパラメータを持つ方が好きです(開始ループはパラメータでもあり、実際は代入コードがパラメータになる可能性があります)。

関連する問題