SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 838|回复: 5
打印 上一主题 下一主题

有问题请教呀

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2008-6-4 21:57:33 | 只看该作者

有问题请教呀

各位,今天小弟写了这么一段程序,编译没问题,但出来的数据集为什么没能剔除掉包含这些条件的记录呀,请高手指点,谢谢

%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;
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2008-6-5 19:28:42 | 只看该作者

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”
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 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集合就是删除后的集合。你将代码复制运行一下,看看副不符合你的要求。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2008-6-6 20:34:00 | 只看该作者

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]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
5#
 楼主| 发表于 2008-6-9 21:34:43 | 只看该作者

Re: 有问题请教呀

问题解决了,多谢各位,以后还要跟各位多多学习
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
6#
 楼主| 发表于 2008-7-28 09:30:49 | 只看该作者

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 &amp;b;
do i=1 to 10;
z1=&quot;dl&quot;||trim(left(put(i,1.)));
if index(card_nbr_1,z1)&gt;0 or index(card_nbr_2,z1)&gt;0 then delete;
end;
drop i  z1;
run;
%mend;
%delete2(a);
proc print;
run;
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|SAS中文论坛  

GMT+8, 2026-2-4 22:18 , Processed in 0.089927 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表