2017-02-04 10 views
1

ここは新しいです。私はデータセットを複数回読み込もうとしています。たとえば、tempという変数のデータセット(tempfileと呼ばれる)に3つの観測値があるとします。 3つの観測値は4,6,5です。私は4回目の観測値が4、5つ目は6と6、5の値は4となるようにxの回数だけ読み込みたいと思います。など私はSASで複数回データセットを読む

data new; 
do i=1 to 100; 
set tempfile; 
end; 
output; 
run; 

ような何かをすることによって、私は.....出力文を省略し、出力文を移動し、DO文を移動することによって、すべてのどの方法を、これを試してみましたが、文字通り数十の方法を、これを試してみました、マクロを試してみてください。誰かを助けることができますか?おかげでジョン

フォロー....

こんにちは:レスポンスの 感謝。それはうまくいった。私は今、ループ内のいくつかの "if then"ステートメントを含むいくつかのことをしたいと思います。 データセットをn回読み込み、毎回2つのthen文があります。 したがって、3つの数字を何度も読み込んだとします。 7,15、および12 各番号が読み取られると、10未満かどうかが尋ねられます。その都度、乱数が作成されます。 次いで1をカウンタに追加されるランド(均一)< 0.4場合 次いで、10未満の場合は、他の1 は> = 10、 そして ランド(均一)< .2場合、1である場合をカウンタ2に添加されますcounter1に追加されます。そうでない場合、counter2に1が追加されます。 ありがとう ジョン

+1

投稿したコードは、データを複製する代わりにサブセット化されます。 100回目の観測ごとに出力されます。したがって、最初の反復は100の観測値を読み、最後のものを出力します。次の反復では同じことが行われるので、200回目の観測などが出力されるので、データの1%のサンプルが得られます。 – Tom

答えて

3

ほとんどのデータステップが実際に停止する方法は、SASが入力の最後を過ぎて読み取るときです。だから、SASがそれをやり遂げるのを防ぐ方法が必要です。

データを複製する最も簡単な方法は、複数の出力文を実行することです。

data want; 
    set tempfile ; 
    do i=1 to 3; 
    output; 
    end; 
run; 

など、だから、最初のレコードは、3回繰り返され、その後第二のレコードが3回繰り返されているもう一つの方法は、単にSET文でデータセットを複数回リストすることです。だから、3回でそれを読むためには、単にあなたはおそらく繰り返し変数の数を作るために、マクロロジックまたはだけでも、マクロ変数を使用することができ

data want; 
    set tempfile tempfile tempfile; 
run; 

を使用しています。 SASは決して終わりを過ぎて読まないと、あなたが戻って先頭にジャンプすることができるように

data _null_; call symputx('list',repeat('tempfile ',3-1)); run; 
data want; set &list; run; 

他の方法はSET声明にPOINT=NOBS=オプションを使用することです。しかし、入力データの最後を読み取ることは決してないので、手動で停止する必要があります。あなたは次の読み取りにどの観察把握するMOD()機能を使用する場合があります、あなたのオリジナルのポストの精神で

data want ; 
    do i=1 to 3; 
    do p=1 to nobs ; 
     set tempfile point=p nobs=nobs; 
     output; 
    end; 
    end; 
    stop; 
run; 

以上。

data want; 
    if _n_ > 100 then stop; 
    p=1+mod(_n_-1,nobs); 
    set tempfile point=p nobs=nobs; 
run; 
+0

これは良い提案ですが、最初のスニペットは異なる注文を生成します。 – Leo

+0

おかげでトム、これらを見て – GKJohn

0

データステップはシリアル処理用に設計されています。この場合、以前の観測値を「記憶」する必要があります。データ・ステップのみを使用して実行することはできますが、そのユース・ケースでは、SAS環境では他のソリューションが簡単です。私が提案する1は、元のファイルをn回追加するマクロです:

%macro replicate(data=, out=, n=)/des='&out is &data repeated &n times.';  
    data &out; 
     set 
     %do i=1 %to &n; 
      &data 
     %end; 
     ; /* This ; ends the data step `set` statement */ 
    run; 
%mend; 

あなたはこのヘルパーを使用しての例をテストすることができます:ここで

%macro test; 
    data have; /* create the example data set */ 
     temp = 4; output; 
     temp = 6; output; 
     temp = 5; output; 
    run; 

    %replicate(data=have, out=want, n=4); 
    proc print; quit; 
%mend; 

は、多くの例で、詳細の多くを追加することa portion of the SAS docです。

+0

レオに感謝、私はそれを試みます。 – GKJohn

3

SAS/STATソフトウェアを使用している場合は、検査してください。

data have; 
    do temp=4,6,5; 
     output; 
     end; 
    run; 
proc surveyselect reps=10 rate=1 out=temp2 noprint; 
    run;