データセットを上下に反転するプログラム

Last-modified: 2017-06-30 (金) 11:51:08

何らかの理由で、データセットの上下を逆にしたいこともあるでしょう。(え、そんなことはない?)
すぐに思いつく方法は、次の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