2013-02-18 26 views
0

我有一个数据集,其中一些SAS Datastep逻辑是 ,需要填充缺失的列或从退出的列派生。需要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; 

我的要求是,我需要写相同的程序来填充V13和V14时V2 IN cftr等;但对于v11中的绑定有不同的参数(对于c,e,g,...分开),而v13和v14对类别保持不变。

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

回答

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值(所以,当合并未能找到在mergeon表中的记录)。

如果您不熟悉SQL,您还可以使用其他几个选项;哈希表可能是最简单的,尽管你也可以使用更新语句(不像我自己熟悉的那样)。

+0

感谢Joe提供的富有洞察力的程序,我想相信为程序制作一个宏是不可能的。 – Dapsy 2013-02-19 19:14:40