2016-05-08 9 views
0

同じ変数でソートするSASデータセットのリストがあります。SAS - ループを使用して複数のデータセットをソート

私はPROCソートステートメントをそれぞれ使用したくないのですが、 ループを使ってコード全体を短縮する方法はありますか?

私はSAS初心者ですので、助けてください!

%let prim =sasdata.qc_no_rx ; 
%let other_removals = sasdata.qc_other_removals; 
%let drops =sasdata.droplist; 


Array data_1(3) $ sasdata.qc_no_rx sasdata.qc_other_removals 

sasdata.droplist ; 

do over data_1; 
Proc sort data = data_1 ; 
by ims_ref; 
end; 
+0

をあなたがしてくださいしようとしたものを投稿してください。おそらくあなたはマクロを使う必要があるでしょうから、あなたの「データセットのリスト」がどのように格納されているかを説明してください。それは既にSASテーブルにありますか?それとも、テキストファイルや頭の中にありますか?または、それらの命名規則がありますか? – Reeza

+0

はい、SASデータセットの形式(テキストファイルではありません)であり、Proc sortを使用してすべてを並べ替える必要があります。私は10個のデータセットを持っているので、10個のProcソートステートメント(各データセットに1つ)を書かなければなりません。私は代わりにループを使用したいです。 –

+0

試したこと、または少なくともあなたの現在のコードを投稿してください。 – Reeza

答えて

1

dname_listという名前のデータセットがあり、データセット名がdnameであるとします。 Call executeはコードを生成して実行します。

私は通常、コマンドを文字列で作成し、それを渡してexecuteを呼び出します。これはdata _null_ステップなので、データセットは生成されませんが、必要に応じて最初にテストするデータセットを生成することができます。

SASはデータセット内のレコードを単独でループするため、ループする必要はありません。

ライブラリ内のデータをソートする場合は、ライブラリ名も含めてください。

data _null_; 
*data dname_execute; 

set dname_list; 
string = catt('proc sort data=', dname, '; by age; run;'); 
call execute(string); 
run; 
1

これは役立つはず:

%macro multsort(indlist,outdlist,byvarlist,ndata); 
%do i = 1 %to &ndata.; 

    %let indata = %scan("&indlist.",&i.," "); 
    %let outdata = %scan("&outdlist.",&i.," "); 
    %let byvars = %scan("&byvarlist.",&i.," "); 
    proc sort data = &indata. out=&outdata.;by &byvars. ;run; 
%end; 
%mend; 

%multsort(indlist=sashelp.Air sashelp.Buy,outdlist=Sa Sb,byvarlist=Air amount,ndata=2); 
+0

引用符は何ですか? %SCAN()関数のデリミタリストで引用符を使うと、%STR()を使わなくてもスペースを見ることができるようになりますが、なぜそれらもリストの周りに置かれました名前? – Tom

+0

これは、引用符で囲まれていないテキストをマクロに渡しているため、引用符で 'outdlist'が' 'Sa Sb ''として解決され、引用符は 'Sa Sb'になります。 –

+0

マクロコードは引用符を他の文字と同じように扱います。したがって、スペース区切りリスト '' Sa Sb ''から最初の項目を取ると、結果は '' Sa''ではなく '' Sa''になります。あなたのコードは '%SCAN()' '' 'をデリミタとして扱い、リストの先頭にある区切り文字をスキップして最初の項目を探します。 – Tom

関連する問題