需要SAS宏程序以避免重复

时间:2013-02-18 16:54:40

标签: sas sas-macro

我有一个数据集,其中有一些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 cftr等时,我需要编写相同的程序来填充v13和v14;但是v11中绑定的不同参数(ceg,...)分开,而v13和v14对于类别保持相同。

我想使用SAS宏来完成这项工作,以避免重复程序。你能帮帮忙吗?

1 个答案:

答案 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不满意,还可以使用其他一些选项;哈希表可能是最简单的,但您也可以使用更新语句(不熟悉那些我自己)。