我可以使用什么 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;
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;