需要SAS宏程序以避免重复

需要SAS宏程序以避免重复,sas,sas-macro,Sas,Sas Macro,我有一个数据集,其中包含一些SAS数据步骤逻辑 需要填充缺少的列或从现有列派生的列 数据集看起来更像如下所示: mpi v1 v2 v3......v9 v10 v11.....v50 001 a 1.324 002 c 0.876 003 f 11.9 004 r 5.7

我有一个数据集,其中包含一些SAS数据步骤逻辑 需要填充缺少的列或从现有列派生的列

数据集看起来更像如下所示:

  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在c、f、t、r等中时,我需要编写相同的程序来填充v13和v14;但是v11中的边界的不同参数对于c,e,g,。。。而类别的v13和v14保持不变


我想使用SAS宏来完成这项工作,以避免重复程序。您能在这方面提供帮助吗?

最好的方法是创建一个值为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值,因此,当合并无法在mergeon表中找到记录时


如果您对SQL不满意,还可以使用其他一些选项;哈希表可能是最简单的,不过您也可以使用自己不太熟悉的update语句。

感谢Joe提供了有见地的程序,我想相信为该程序设计宏是不可能的。