楼主: ruiwanlinjob
3653 8

[原创博文] 求教SAS大侠关于一个宏循环的问题! [推广有奖]

  • 0关注
  • 1粉丝

大专生

41%

还不是VIP/贵宾

-

威望
0
论坛币
444 个
通用积分
0
学术水平
0 点
热心指数
1 点
信用等级
0 点
经验
711 点
帖子
41
精华
0
在线时间
51 小时
注册时间
2009-4-25
最后登录
2023-11-17

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
请教sas大侠们:
问题:我在对d_200501数据集做缺失值赋值的code如下:
data mylib.d_200501;set mylib.d_200501;                                                            
  array arr1 _numeric_;do over arr1; if missing(arr1) then arr1=-9999;end;
  array arr2 _character_;do over arr2; if missing(arr2) then arr2=.M;end;
run;
或者:(列出变量名)
data mylib.d_200501;
set mylib.d_200501;
array A{2}
MOB_recent_loan
tot_pmt_amt;
do i=1 to 2;
if(A{i}=.)then A{i}=-9999;

array A{2}
closed_dt1
lmn;
do i=1to 2;
if(A{i}=' ')then A{i}='M';
end;
run;
这两个都是没有问题的,可是我想用宏代码把他们编写出来就不行了。code和log如下:
%macro fuzhi(set);
data &set;
set &set;
array A _numeric_;
%do over A;
%if missing(A)%then A=-9999;
%end;
array B _char_;
%do over B;
%if missing(B)%then B="M";
%end;
run;
%mend fuzhi;
%fuzhi(mylib.d_200501);
错误代码如下:122  %macro fuzhi(set);
123  data &set;
124  set &set;
125  array A _numeric_;
126  %do over A;
ERROR: An unexpected semicolon occurred in the %DO statement.  A dummy macro will be compiled.
127  %if missing(A)%then A=-9999;
128  %end;
129  array B _char_;
130  %do over B;
ERROR: An unexpected semicolon occurred in the %DO statement.  A dummy macro will be compiled.
131  %if missing(B)%then B="M";
132  %end;
133  run;
134  %mend fuzhi;
在宏当中,array这个关键词是没法用的,应该是这个原因,可是我不知道该如何用可以循环的语句来实现这个过程。不列出变量名的那种?因为有的数据集的变量很多!
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:宏循环 Unexpected statement Character Expected character

回帖推荐

pobel 发表于2楼  查看完整内容

%macro fuzhi(set);data &set;set &set;array A _numeric_;do over A;if missing(A)then A=-9999;end;array B _char_;do over B;if missing(B)then B="M";end;run;%mend fuzhi;%fuzhi(mylib.d_200501);

本帖被以下文库推荐

沙发
pobel 在职认证  发表于 2009-6-5 15:04:00 |只看作者 |坛友微信交流群

%macro fuzhi(set);
data &set;
set &set;
array A _numeric_;
do over A;
if missing(A)then A=-9999;
end;
array B _char_;
do over B;
if missing(B)then B="M";
end;
run;
%mend fuzhi;
%fuzhi(mylib.d_200501);

已有 2 人评分经验 论坛币 信用等级 收起 理由
bakoll + 3 + 3 精彩帖子
死亡舞步 + 1

总评分: 经验 + 3  论坛币 + 3  信用等级 + 1   查看全部评分

和谐拯救危机

使用道具

藤椅
ruiwanlinjob 发表于 2009-6-5 15:31:00 |只看作者 |坛友微信交流群
高手啊,解决问题了,哥哥好厉害啊,我想把我的金币全部给你!

使用道具

板凳
ruiwanlinjob 发表于 2009-6-5 15:39:00 |只看作者 |坛友微信交流群
哥哥,可不可以留给我一个msn或者qq啊,我得向你请教请教啊!

使用道具

报纸
nkwilling 发表于 2009-6-5 17:02:00 |只看作者 |坛友微信交流群

楼主还是没有搞清%do和do的关系,前者是macro的循环条件,后者是data步的循环条件,你的需求是data步的,必须用do语句,而非%do语句。类似的还有%if和if语句等,你最好多写一些例子来测试他们之间的区别。一定要记住:macro中的所有判断条件包括开关语句和循环语句都不是执行语句,他们最终都是要被符号表替换成sas代码才能执行。举个例子:

%macro nkwilling;

%do i=1 %to 2;

data nkwilling_&i.;

set sashelp.class;

run;

%end;

%mend nkwilling;

%nkwilling;

上面的宏等价于:

data nkwilling_1;

set sashelp.class;

run;

data nkwilling_2;

set sashelp.class;

run;

你的明白?

使用道具

地板
pobel 在职认证  发表于 2009-6-5 17:54:00 |只看作者 |坛友微信交流群
楼上这位才是真正的高手!
和谐拯救危机

使用道具

7
cybericsson 发表于 2009-6-9 02:53:00 |只看作者 |坛友微信交流群
呵呵我的明白了。

使用道具

8
wlnk 发表于 2012-9-24 11:45:54 |只看作者 |坛友微信交流群
nkwilling 发表于 2009-6-5 17:02
楼主还是没有搞清%do和do的关系,前者是macro的循环条件,后者是data步的循环条件,你的需求是data步的,必 ...
果然是高手,我也一直没搞明白两者之间的区别,再多测试测试,学习学习。
你若不想做,会找到一个借口;你若想做,会找到一个方法。

使用道具

9
kittyforever 发表于 2013-1-18 09:41:57 |只看作者 |坛友微信交流群
5楼很有见地

使用道具

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

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-28 00:27