|
|
板凳

楼主 |
发表于 2008-6-6 18:44:33
|
只看该作者
Re: 有问题请教呀
data a;
input card_nbr_1:$8. @@;
cards;
dl1 dl2 dl3 dl4 dl20 dl6 dl67 dl50 jjjdl30 dl20ee dhl20 s1 s2 s3 s4
;
run;
data a;
set a;
card_nbr_2=card_nbr_1;
run;
%macro delete2(b);
data delete;
set &b;
do i=1 to 50;
if i<10 then do;
z1="dl"||trim(left(put(i,1.)));
if index(card_nbr_1,z1)>0 or index(card_nbr_2,z1)>0 then delete;
end;
else do;
z2="dl"||trim(left(put(i,2.)));
if index(card_nbr_1,z2)>0 or index(card_nbr_2,z2)>0 then delete;
end;
end;
drop i z2 z1;
run;
%mend;
%delete2(a);
proc print;
run;
sas的宏变量引用很麻烦,%do i=1 %to 50.虽然有i这个变量,但是你休想引用它,因为&i没定义,如果用,%do &i=1 %to 50又不能编译,用%let读出来还是i这个字母而不是引用,用call symput要到下一个部才能调用,可谓是一点办法都没有。
真搞不懂功能强大的宏语句为什么不能直接调用do循环中的变量。我写了这段宏,把含有dl1到dl50的所有观测删除了,
引用时将数据集合名字套进去就可以了,那个delete集合就是删除后的集合。你将代码复制运行一下,看看副不符合你的要求。 |
|