何らかの理由で、データセットの上下を逆にしたいこともあるでしょう。(え、そんなことはない?)
すぐに思いつく方法は、次の2段階のステップを経て行うことです。
1.DATAステップで、データセットにIDを振る
2.SORTプロシジャを使って、IDで降順に並べる
たとえば、このような感じです。
data data1;
input x y z;
datalines;
1 2 3
4 5 6
7 8 9
10 11 12
;
run;
OBS x y z
1 1 2 3
2 4 5 6
3 7 8 9
4 10 11 12
data data2;
set data1;
_id=_n_;
run;
proc sort data=data2 out=data2(drop=_id);
by descending _id;
run;
OBS x y z
1 10 11 12
2 7 8 9
3 4 5 6
4 1 2 3
しかし、この方法はよく考えるとあまり効率的ではありません。その理由は、わざわざ2つのステップを用いていることと、単に反転させるだけに(オムニバスな)ソートアルゴリズムを使うのはいかがか、ということです。
(確か)SAS8以降では、SETステートメントでPOINT=オプションがサポートされています。POINT=で変数を指定すると、その変数値に対応したオブザベーションをセットします。これを使えば、(特に大きなデータセットでは)効率化を図ることができます。
data data2;
do _i=n to 1 by -1;
set data1 point=_i nobs=n;
output;
end;
stop;
run;
コメント
- 質問 どんなときにつかうのですか? -- Meow 2008-03-18 (火) 10:38:50
- うーん、あまり実用性はないかもしれませんね。プロシジャを使って分析をする際には、上下関係ないですし -- たねや 2008-03-20 (木) 11:42:21
- でも、ここで使ったPOINT=は、SAS8以降の機能で、あまり知られていないようで持ち出してみました。うまく使うと、色々とイケますよ -- たねや 2008-03-20 (木) 11:44:01
- たとえば,ログファイルのように,時間の古いもの順にならんでいる大きいファイルがあって,新しいデータから順に時間をさかのぼって処理をしたいとき,ソートよりこの方法のほうが速いのではないでしょうか?試してみませんが,理論的にはソートより単純な処理だから軽いように思います. -- 翔 2009-02-04 (水) 01:26:06
- なるほど、ありがとうございます。ちなみに、巨大データになればなるほど処理速度に差がつくと思います。 -- たねや 2009-02-04 (水) 23:04:37
- ただいま,実務で使ってみました.ソートの3倍速かったです.目的は,後続するobsと比較してデータを間引く処理で,後ろ向きにlag関数を使うためでした.ありがとうございました! -- 翔 2009-04-02 (木) 17:42:14
- pointって使いこなしたら結構便利です -- keroroma? 2017-06-30 (金) 11:51:07