SAS:如何将组中排名较高的第一个值分配给整个组

SAS:如何将组中排名较高的第一个值分配给整个组,sas,proc-sql,Sas,Proc Sql,在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

在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_秩为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
我通过创建一个中间数据集并使用第一个评级值创建一个临时变量,然后将其与原始数据集合并,从而实现了这个评级。 但我想知道是否有一个替代的和简单的方法来做到这一点


提前谢谢

如果所有评级值都为0,则不清楚要使用什么规则。然而,下面的内容与您想要的非常接近。它使用双道循环来按组计算每个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;

对于“IG”ID组,如何选择“A”而不是“HY”和“NR”评级?“AK”和“DC”组为什么选择“NR”?