0

在 SAS 中,如何将组中排名较高的第一个 Rating 值分配给整个组。见下面的数据集

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 按组内的滚动最大值,然后将其附加到该按组中的每个记录。这意味着您必须读取输入数据集两次,但避免生成中间数据集。

您发布的示例数据未按 ID 排序,因此我假设如果同一 ID 在非连续行中出现两次,您希望为每个实例计算单独的 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 回答