2017-12-18 15 views
4

SASデータステップでデータをソートする必要があります。正確に私が意味することは:procソートの作業はデータステップで行う必要があります。解決策はありますか?SASのデータステップを使用してデータをソートする方法

+0

あなたはなぜこのようなことをしたいのか知りたいです。 –

+0

ちょっと考えました。複雑な方法でこれを行う必要はありません。しかし、私が知りたい熱意と不安から、それはデータステップで可能ですか?私はGoogleで検索しましたが、私はここに投稿したので、何の答えも見つかりませんでした。 – Saran

答えて

3

データステップのみのソリューションをお探しの場合は、PROC SORTの作業をhash tableとすることができます。注意は、あなたがそれを行うのに十分な記憶が必要なことです。

単純なソートを行う場合は、ordered:'yes'オプションを使用してハッシュテーブルをロードし、新しいテーブルに出力します。デフォルトでは、ordered:yesはデータを昇順でソートします。 descendingも指定できます。

単純ソート

data _null_; 

    /* Sets up PDV without loading the table */ 
    if(0) then set sashelp.class; 

    /* Load sashelp.class into memory ordered by Height. Do not remove duplicates. */ 
    dcl hash sortit(dataset:'sashelp.class', ordered:'yes', multidata:'yes'); 

     sortit.defineKey('Height');  * Order by height; 
     sortit.defineData(all:'yes'); * Keep all variables in the output dataset; 

    sortit.defineDone(); 

    /* Output to a dataset called class_sorted */ 
    sortit.Output(dataset:'class_sorted'); 
run; 

デデュープ

multidataオプションを削除する以外、まったく同じ操作を行い、重複を削除するには。下の表では、観測値(8,9)と(15,16)は互いに重複しています。観察9と16は削除されます。

data _null_; 

    /* Sets up PDV without loading the table */ 
    if(0) then set sashelp.class; 

    /* Load sashelp.class into memory ordered by Height. Do not keep duplicates. */ 
    dcl hash sortit(dataset:'sashelp.class', ordered:'yes'); 

     sortit.defineKey('Height');  * Order by height; 
     sortit.defineData(all:'yes'); * Keep all variables in the output dataset; 
    sortit.defineDone(); 

    /* Output to a dataset called class_sorted */ 
    sortit.Output(dataset:'class_sorted'); 
run; 
1

解決策proc ds2があります。

/*Just prepare dataset, because DS2 responds with an error on libraries like sashelp. */ 
data sql_prep; 
set sashelp.class; 
run; 

/*Delete test dataset before ds2 func, to avoid errors*/ 
proc datasets nodetails nolist; 
delete test; 
run; 

proc ds2; 

data test; 
    method run(); 
     set {select * from sql_prep order by Weight}; 
    end; 
enddata; 
run; 
quit; 

さらにinfoについては、sashelpライブラリのds2エラーについてです。

Appendix ds2 docsには、ds2のSQLについてです。

+0

これが有効な場合、私は 'dosubl'も公正ゲームだと思います... – user667489

2

ステュは例えば、それに私を打つが、あなたのデータセットが一意のキーが含まれている、とあなたはメモリ内全体を収めることができ、あなたはハッシュのソートを使用することができます提供:

data _null_; 
    if 0 then set sashelp.class; 
    declare hash h(dataset:"sashelp.class",ordered:"a"); 
    rc = h.definekey("age","sex","name"); 
    rc = h.definedata(ALL:'yes'); 
    rc = h.definedone(); 
    rc = h.output(dataset:"class_sorted"); 
    stop; 
run; 

をした場合組み込みのソート方法の使用を避けることは本当に決まっていますが、特に愚かなアプローチは、データセット全体を一連のテンポラリ配列にロードし、手作業でアルゴリズムを使用してソートし、再度エクスポートすることです。

https://codereview.stackexchange.com/questions/79952/quicksort-in-sas-for-sorting-datasets

関連する問題