0

SAS では、グループ内のランクが高い最初の評価値をグループ全体に割り当てるにはどうすればよいですか。以下のデータセットを参照してください

ID  Rating  Price   Rt_Rank
AN  A       105     0
AN  B3      200     1
IG  A2      705     0
IG  A       700     1
IG  HY      102     1
IG  NR      1005    1
RS  HY      20      1
AK  NR      803     0
DC  A       0       0
DC  NR      12000   0

グループの rt_rank が 1 の場合、グループ全体に最初の価値評価を割り当てたいと思います。

必要なデータセット:

ID  Rating  Price   Rt_Rank Rating_grp
AN  B       105     0       B3
AN  B3      200     1       B3
IG  A2      705     0       A
IG  A       700     1       A
IG  HY      102     1       A
IG  NR      1005    1       A
RS  HY      20      1       HY
AK  NR      803     0       NR
DC  A       0       0       NR
DC  NR      12000   0       NR

中間データセットを作成し、この最初の評価値で一時変数を作成してから、元のデータセットとマージすることで、この rating_grp を実現しました。しかし、これを行う別の簡単な方法があるかどうか知りたいです。

前もって感謝します!

4

1 に答える 1

0

すべての Rating 値がランク 0 の場合にどのルールを使用するかは明確ではありません。二重 DOW ループを使用して、各 ID グループ内のローリング最大値を計算し、それをそのグループ内のすべてのレコードに添付します。これは、入力データセットを 2 回読み取る必要があることを意味しますが、中間データセットを作成することは避けます。

投稿したサンプル データは ID で並べ替えられていないため、連続しない行で同じ ID が 2 回表示された場合は、インスタンスごとに個別の rating_grp 値を計算する必要があると想定しています。

data have;
    length ID RATING $2;
    input ID $ Rating $  Price  Rt_Rank;
    cards;
AN  A       105     0
AN  B3      200     1
IG  A2      705     0
IG  A       700     1
IG  HY      102     1
IG  NR      1005    1
RS  HY      20      1
AK  NR      803     0
DC  A       0       0
DC  NR      12000   0
;
run;

data want;
    if 0 then set have; /*Make sure columns are in correct order in output dataset*/
    length rating_grp $2;
    max_rank = -1; /*Before we start each by group, reset the rolling max*/
    call missing(rating_grp);
    do until(last.ID); /*Work through each by group keeping a rolling max*/
        set have;
        by ID notsorted;
        if rt_rank > max_rank then do; /*Update rating_grp each time a new max is reached*/
            max_rank = rt_rank;
            rating_grp = rating;
        end;
    end;
    do until(last.ID); /*Work through the by group a second time, this time outputting all records*/
        set have;
        by ID notsorted;
        output;
    end;
    drop max_rank;
run;
于 2014-11-18T20:29:06.203 に答える