全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
4077 8
2009-06-05
请教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这个关键词是没法用的,应该是这个原因,可是我不知道该如何用可以循环的语句来实现这个过程。不列出变量名的那种?因为有的数据集的变量很多!
二维码

扫码加我 拉你入群

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

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

全部回复
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);

二维码

扫码加我 拉你入群

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

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

2009-6-5 15:31:00
高手啊,解决问题了,哥哥好厉害啊,我想把我的金币全部给你!
二维码

扫码加我 拉你入群

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

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

2009-6-5 15:39:00
哥哥,可不可以留给我一个msn或者qq啊,我得向你请教请教啊!
二维码

扫码加我 拉你入群

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

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

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;

你的明白?

二维码

扫码加我 拉你入群

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

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

2009-6-5 17:54:00
楼上这位才是真正的高手!
二维码

扫码加我 拉你入群

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

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

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群