4

データ セットの各エントリに実数が含まれるようなn行と列を持つデータ セットがあるとします。各行内pの列をランク付けする方法を探しています。pこのランキングの出力はp、同点を考慮したランクの長さベクトルである必要があります。

たとえば、私のデータ セットに 5 つの列があるとします。最初の行は次のようになりrow 1 = {10, 13, 3, 3, -4}ます。この行でいくつかの操作を実行し、最終的に結果を取得したいと思いrow 1 ranks = {3, 4, 2, 2, 1}ます。2 行目は次のようrow 2 = {8, 3, -6, 5, 2}になり、この行の結果は になりますrow 2 ranks = {5, 3, 1, 4, 2}

この機能は SAS に実装されていますか? 同点を考慮しないコードを生成しましたが、不正確に行われた行ランキングを修正するのに不当な時間がかかるほど頻繁に発生します。

4

4 に答える 4

5

興味深い質問です。考えられる解決策の 1 つを次に示します。

data have;
   p1=10; p2=13; p3=3;  p4=3; p5=-4; output;
   p1=8;  p2=3;  p3=-6; p4=5; p5=2;  output;
run;

data want;
   set have;
   array p(*) p1-p5;
   array c(*) c1-c5;
   array r(*) r1-r5;

   /* Copy vector to temp array and sort */
   do i=1 to dim(p); 
      c(i) = p(i); 
      end;
   call sortn(of c(*));

   /* Search new sorted array for the original position */
   do i=1 to dim(c);
      if i = 1 then rank=1;
      else if c(i) ne c(i-1) then rank + 1;
      do j=1 to dim(p);
         if p(j) = c(i) then do;
            r(j) = rank;
            end;
         end;
      end;

   /* PUT statement to see result in log */
   put +3 p(*)
     / +3 c(*)
     / +3 r(*);

   drop i j rank c1-c5;
run;
于 2013-01-07T19:53:28.297 に答える
3

これを行うにはいくつかのアレイが必要になるように思えます。

  1. 配列1:ランクを格納する配列
  2. 配列2:値を並べ替える配列
  3. 配列3:元の変更されていないデータ

私は今、コードを書く時間がありませんが、このような何かを使用すると、多くの手間がかかります。

http://support.sas.com/kb/24/754.html

于 2013-01-07T19:47:11.533 に答える
2

楽しみのために、ランク付きの新しいデータセットが必要であるというOPの回答を踏まえて、PROCRANKメソッドを次に示します。おそらくデータステップよりも速くはありませんが、おそらく複数の状況でより簡単で使いやすく、コーディングを実際に間違えることがないという追加の利点があります(実際にクラッシュすることはありません)。

data have;
input id x1-x5;
datalines;
1 10 13 3 3 -4
2 5 6 5 2 3
;;;;
run;

proc transpose data=have out=temp;
by id;
var x1-x5;
run;
proc rank data=temp out=temprank;
var col1;
by id;
run;
proc transpose data=temprank out=want(drop=_name_ _label_);
by id;
var col1;
id _name_;
run;
于 2013-01-07T21:31:51.570 に答える
2

OPがIMLを使用しないと言ったとしても、他の人がこれを検索するのに役立つ場合に備えて、これを追加することもできます。基本的にベクトル/行列の問題であるため、IMLはこの問題を解決する最も簡単な方法です...

proc iml;
p={10 13 3 3 -4, 5 6 5 2 3};
r=j(2,5,.);
print p r;
do i = 1 to nrow(p);
  r[i,]=ranktie(p[i,]);
end;
print p r;
quit;

OPとは少し異なる方法で試行を処理するため、要求されたソリューションとまったく同じようにするためにいくつかの作業が必要になりますが、一般的には1,2.5,2.5,4,5 [または1,2,2,4,5]おそらく、1,2,2,3,4 ではなく、本当に必要なものです。2 と 3 が同点の場合、4 と 5 は 4 と 5 のままで、3 と 4 に移動しないでください。

于 2013-01-07T20:20:38.217 に答える