我可以使用什么 SAS 函数来组合这些 if-then 语句?

What SAS function can I use to combine these if-then statements?

data cervical3;
    set cervical2;
    if R_Risk <5.00 then rriskgroup=1;
    else if 5.01 < R_Risk <=10.00 then rriskgroup=2;
    else rriskgroup=3;      
run;
data cervical4;
    set cervical2;
    if P_Risk <5.00 then priskgroup=1;
    else if 5.01 < P_Risk <=10.00 then priskgroup=2;
    else priskgroup=3;
run;

我希望将 cervical3 与 cervical4 结合使用

您可以在单个数据步骤中创建两个列,无需合并两个表。

如果 r_risk = 5 又会怎样?在您的情况下,分配的风险组为 3,不确定这是否有意。在下面的示例中,我将其分配给第 1 组。

data want;
set cervical2;
rriskgroup = ifn(r_risk <= 5, 1, ifn(5 < r_risk <= 10, 2, 3));
priskgroup = ifn(p_risk <= 5, 1, ifn(5 < p_risk <= 10, 2, 3));
run;

很少有方法能超越 IFN 简化 - 如果您有 2 个以上,它就无法扩展。

  • 合并步骤
data cervical3;
    set cervical2;
    if R_Risk <5.00 then rriskgroup=1;
    else if 5.01 < R_Risk <=10.00 then rriskgroup=2;
    else rriskgroup=3;      

    if P_Risk <5.00 then priskgroup=1;
    else if 5.01 < P_Risk <=10.00 then priskgroup=2;
    else priskgroup=3;
run;

  • 改用数组,如果你有 2 个以上的数组,这个扩展很好
data cervical3;
    set cervical2;

    array scores(2) r_risk p_risk;
    array groups(2) rriskgroup priskgroup;
 
    do i=1 to dim(scores);
    if scores(i)<5.00 then groups(i)=1;
    else if 5.01 < scores(i) <=10.00 then groups(i)=2;
    else groups(i)=3;      

    end;
run;
  • IMO最优解是与数组法配对的格式。
proc format;
invalue risk_cat_fmt (fuzz=0)
low - 5 = 1
5 <- 10 = 2
10 <- high = 3;
run;

*apply format - no recoding;
proc print data=cervical2 (obs=10);
var r_risk p_risk;
format r_risk p_risk risk_cat_fmt.;
run;

*recoded values;
data cervical3;
    set cervical2;

    array scores(2) r_risk p_risk;
    array groups(2) rriskgroup priskgroup;
 
    do i=1 to dim(scores);
        groups(i) = input(scores(i), risk_cat_fmt.);     
     end;
run;