0

次のデータベースがあるとします。

Min Rank Qty
2   1    100
2   2    90
2   3    80 
2   4    70
5   1    110
5   2    100
5   3    90
5   4    80
5   5    70
7   1    120
7   2    110
7   3    100
7   4    90

次のような分単位の連続値を持つデータベースが必要です。

Min Rank Qty
2   1    100
2   2    90
2   3    80 
2   4    70
3   1    100
3   2    90
3   3    80 
3   4    70
4   1    100
4   2    90
4   3    80 
4   4    70
5   1    110
5   2    100
5   3    90
5   4    80
5   5    70
6   1    110
6   2    100
6   3    90
6   4    80
6   5    70
7   1    120
7   2    110
7   3    100
7   4    90

SASでこれを行うにはどうすればよいですか? 前の分を複製する必要があるだけです。1 分あたりの観測数はさまざまです... 4 つまたは 5 つ以上になる場合があります。

4

2 に答える 2

0

ばかげた数の観測がない限り、転置するとこれが簡単になると思います。

現時点では sas にアクセスできないので、ご容赦ください (動作しない場合は、明日テストできます)。

proc transpose data=data out=data_wide prefix=obs_;
  by minute;
  id rank;
  var qty;
run;

*sort backwards so you can use lag() to fill in the next minute;
proc sort data=data_wide;
  by descending minute;
run;

data data_wide; set data_wide;
  nextminute = lag(minute);
run;

proc sort data=data_wide;
  by minute;
run;

*output until you get to the next minute;
data data_wide; set data_wide;
  *ensure that the last observation is output;
  if nextminute = . then output;
  do until (minute ge nextminute);
    output;
    minute+1;
  end;
run;

*then you probably want to reverse the transpose;
proc transpose data=data_wide(drop=nextminute)
               out=data_narrow(rename=(col1=qty));
  by minute;
  var _numeric_;
run;

*clean up the observation number;
data data_narrow(drop=_NAME_); set data_narrow;
  rank = substr(_NAME_,5)*1;
run;

繰り返しますが、今はこれをテストすることはできませんが、うまくいくはずです。

他の誰かが、リバースソート/ラグ/フォワードソートする必要がないようにする賢い解決策を持っているかもしれません。私はこれを以前に扱ったように感じますが、今の私の明らかな解決策は、以前のソートで逆方向にソートして(降順ソートで転置を問題なく実行できます)、余分なソートを節約することです。

于 2013-10-04T01:10:42.277 に答える