0

我有一个数据集,其中需要一些 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 中的边界参数不同(分别用于c, e, g,...),而 v13 和 v14 的类别保持不变。

我想使用 SAS 宏来完成此操作以避免程序重复。你能帮忙解决这个问题吗?

4

1 回答 1

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

于 2013-02-18T17:26:03.227 回答