%marco a;
%do i=1 %to 50;
if index(card_nbr_1,"dl&i.") >0 or index(card_nbr_2,"dl&i.") then delete;
%end;
%mend;
data b;
set t;
%a;
run;作者: shiyiming 时间: 2008-6-5 19:28 标题: Re: 有问题请教呀 [quote:3jj70nhr]编译没问题[/quote:3jj70nhr]?
[quote:3jj70nhr]%marco a[/quote:3jj70nhr]中marco就写错了,应该为macro
[quote:3jj70nhr]if.... then ....[/quote:3jj70nhr]前面都少了个%
[quote:3jj70nhr]index[/quote:3jj70nhr]在macro中混用了个dataset中的函数index
[quote:3jj70nhr]%mend[/quote:3jj70nhr]后面少了个macro名称“a”作者: shiyiming 时间: 2008-6-6 18:44 标题: 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集合就是删除后的集合。你将代码复制运行一下,看看副不符合你的要求。作者: shiyiming 时间: 2008-6-6 20:34 标题: Re: 有问题请教呀 我试着把ls的code简化了下:
[code:198smq7m]data a;
input card_nbr_1:$8. @@; card_nbr_2=card_nbr_1;
cards;
dl1 dl2 dl3 dl4 dl20 dl6 dl67 dl50 jjjdl30 dl20ee dhl20 s1 s2 s3 s4
;
run;
data b;
set a;
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;
proc print;run;
[/code:198smq7m]作者: shiyiming 时间: 2008-6-9 21:34 标题: Re: 有问题请教呀 问题解决了,多谢各位,以后还要跟各位多多学习作者: shiyiming 时间: 2008-7-28 09:30 标题: Re: 有问题请教呀 这个更简单哦 <!-- s:lol: --><img src="{SMILIES_PATH}/icon_lol.gif" alt=":lol:" title="Laughing" /><!-- s:lol: -->
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 10;
z1="dl"||trim(left(put(i,1.)));
if index(card_nbr_1,z1)>0 or index(card_nbr_2,z1)>0 then delete;
end;
drop i z1;
run;
%mend;
%delete2(a);
proc print;
run;