我有一个数据集,其中有一些SAS Datastep逻辑 需要填充缺少的列,或者从退出的列派生。
数据集看起来更像下图:
mpi v1 v2 v3......v9 v10 v11.....v50
001 a 1.324
002 c 0.876
003 f 11.9
004 r 5.7
005 b 3.3
. . .
. . .
n t 0.4
我实际上开发了以下程序:
/*a*/
IF v2 ('a') AND 0 <= v11 <= 2 THEN DO;
v13 = 1;
v14 =20;
END;
IF v2 IN ('a') AND 2 < v11 <= 3.1 THEN DO;
v13 = 2;
v14 =40;
END;
IF v2 IN ('a') AND 3.1 < v11<= 5.3 THEN DO;
v13 = 3;
v14 =60; END;
IF v2 IN ('a') AND 5.3 < v11 <= 11.5 THEN DO;
v13 = 4;
v14 =80;
END;
IF v2 IN ('a') AND v11 > 11.5 THEN DO;
v13 = 5;
v14 =100;
END;
我的要求是,当v2 IN c
,f
,t
,r
等时,我需要编写相同的程序来填充v13和v14;但是v11中绑定的不同参数(c
,e
,g
,...)分开,而v13和v14对于类别保持相同。
我想使用SAS宏来完成这项工作,以避免重复程序。你能帮帮忙吗?
答案 0 :(得分:0)
执行此操作的最佳方法是创建值为v2,v11,v13,v14的数据集,并将其合并或以其他方式与数据集合并。
当你有一个值的范围时,这样做会有点复杂,但绝不是不可能的。
假设你有一个数据集,包括v2,v11min,v11max,v13和v14。
data mergeon;
input v2 $ v11min v11max v13 v14;
datalines;
a 0 2 1 20
a 2 3.1 2 40
a 3.1 5.3 3 60
a 5.3 11.5 4 80
a 11.5 9999 5 100
c 0 4 1 20
c 4 8.1 2 40
c 8.1 9.6 3 60
c 9.6 13.5 4 80
c 13.5 9999 5 100
;;;;
run;
data have;
input mpi v2 $ v11 v13 v14;
datalines;
1 a 2 0 0
2 a 4 0 0
3 c 1 0 0
4 c 7 0 0
5 c 9 0 0
6 a 22 0 0
7 a 10 0 0
;;;;
run;
proc sql;
create table want as
select H.mpi, H.v2, H.v11, coalesce(M.v13,H.v13) as v13, coalesce(M.v14,H.v14) as v14
from have H
left join mergeon M
on H.v2=M.v2
and M.v11min < H.v11 <= M.v11max
;
quit;
COALESCE选择第一个非缺失值,这意味着只有在缺少M.v13时才会保留H.v13值(因此,当合并无法在合并表中找到记录时)。
如果您对SQL不满意,还可以使用其他一些选项;哈希表可能是最简单的,但您也可以使用更新语句(不熟悉那些我自己)。