2016-10-26 18 views
1

データセットのn番目の行のすべてを抽出し、その後のすべての33番目の行を抽出して新しいデータセットに保存したいとします。データセットのn番目の行ごとに抽出

Iに含まれるn回互いに下に添付33の推定値を、私は33になるまで、私は等セットA1A0と呼ばれるデータセットに推定a0の全てを抽出し、次いでa1推定値の全てしたいデータセットを有しますデータセット。

これはすべての要素で行うことができますが、これは多くのコードを必要とし、簡単にしたいと思います。これは、データセットに名前を付け、その中のすべての要素を抽出するコードです。

data a0; 
set _parest1; 
if mod(_n_,33) = 1; 
run; 

これは大きな問題の一部である特定の問題です。私は34の推定されたパラメータ(a0、a1 ... a33)を含む多数のデータセットを持っており、私は各推定値の平均をとってみたいです。

答えて

1

データセットオプションfirstobs=を使用して、n番目のレコードから開始します。

data want; 
set have(firstobs=10); 
if _n_ = 1 then output; 
else if mod(_n_,33) = 1 then output; 
run; 

これをループするには、マクロを使用します。例えば:彼らは同じである必要はありませんよう

data test; 
do i=1 to 100; 
output; 
end; 
run; 

%macro loop_split(n,mod, ds, outPre); 
%local i j; 
%do i=1 %to &n; 
    %let j=%eval(&i-1); 
    data &outPre&j; 
    set &ds(firstobs=&i); 
    if _n_ = 1 then output; 
    else if mod(_n_,33) = 1 then output; 
    run; 
%end; 
%mend; 

%loop_split(33,33,test,want); 

私はnmod値を分割しますが、あなたのケースです。

+0

私は気に入っています。私の質問を編集しました。あなたの例では、10で始まって次の2x33行を取るが、11で始まり次の2x33行と12を取ることができるようにしたい。データセット? –

+0

私はこれをマクロでラップすることができます。分、私はあなたのために編集します。 – DomPazz

+0

優秀 - ありがとう –

2

これを行うもう1つの方法は、ハッシュメソッドのハッシュです。これは、主に対象となるPaul Dorfmanの論文のData Step Hash Objects as Programming Toolsから引き出されています。

data estimates; 
    do id = 1 to 50; 
    output; 
    end; 
run; 

data _null_; 
    if 0 then set estimates; 
    length estimate 8; 
    if _n_=1 then do; 
    declare hash e(); 
    declare hash h(ordered:'a'); 
    h.defineKey('estimate'); 
    h.defineData('estimate','e'); *this 'e' is the name of the other hash!; 
    h.defineDone(); 
    declare hiter hi('h'); 
    end; 
    do _n_ = 1 by 1 until (eof); 
    set estimates end=eof; 
    estimate = mod(_n_-1,5); 
    rc_h = h.find(); 
    if rc_h ne 0 then do; 
     e = _new_ hash(ordered:'a'); 
     e.defineKey('estimate','id'); 
     e.defineData('estimate','id'); 
     e.defineDone(); 
     h.replace(); 
    end; 
    e.replace(); 
    end; 

do rc = hi.next() by 0 while (rc = 0) ; 
    e.output (dataset: cats('out',estimate)) ; 
    rc = hi.next() ; 
end ; 
run; 

これにより、特定の数のデータセットを任意に出力することができます。ここでは5を33に置き換えて変数名を調整します( 'estimate'は見積もり番号ですが、私はMODを使って計算しますが、データセットに既に入っていますが、IDはその行のIDと同じです行番号は_N_でもいいですし、他のデータ変数があれば(おそらくそうです)、定義データにeのデータを追加することができます。

関連する問題