SAS - 如何使用宏修改多个数据集?
SAS - How to modify several datasets using a macro?
我正在尝试修改工作中的一些数据集(它们的名称遵循特定顺序,例如 data_AXPM061203900_20120104、data_AXPM061203900_20120105、data_AXPA061204100_20120103、data_AXPA061204100_20120104)图书馆。例如,我想删除所有数据集中的变量"price=0"。
我正在使用以下内容创建一个 table 来识别数据集:
proc sql ;
create table data.mytables as
select *
from dictionary.tables
where libname = 'WORK'
order by memname ;
quit ;
下一步,我尝试使用宏:
%macro test;
proc sql ;
select count(memname) into: obs from data.mytables;
%let obs=&obs.;
select catx("_", "data", substr(memname, 6, 13), substr(memname,20,27))
into :setname1-:setname&obs.
from data.mytables;
quit;
%do i=1 %to &obs.;
data &&setname&i
set &&setname&i
if bid_price= '.' then delete;
%end;
%mend test;
然而,彻底失败了。谁能给我一些建议?我真的不擅长宏。错误包括:
- 56: 无法确定 LINE 和 COLUMN。
- ERROR 56-185: SET is not allowed in the DATA statement when option DATASTMTCHK=COREKEYWORDS.检查中是否缺少分号
DATA 语句,或使用 DATASTMTCHK=NONE.
您在 DATA 语句和 SET 语句中缺少分号,可能应该添加一个 运行 语句。建议你试试:
%do i=1 %to &obs.;
data &&setname&i ;
set &&setname&i ;
if bid_price= '.' then delete;
run;
%end;
注意DELETE语句是删除记录,不是删除变量。上面的代码期望 bid_price 是一个字符变量,并且当值为 '.' 时你想删除记录。
我正在尝试修改工作中的一些数据集(它们的名称遵循特定顺序,例如 data_AXPM061203900_20120104、data_AXPM061203900_20120105、data_AXPA061204100_20120103、data_AXPA061204100_20120104)图书馆。例如,我想删除所有数据集中的变量"price=0"。
我正在使用以下内容创建一个 table 来识别数据集:
proc sql ;
create table data.mytables as
select *
from dictionary.tables
where libname = 'WORK'
order by memname ;
quit ;
下一步,我尝试使用宏:
%macro test;
proc sql ;
select count(memname) into: obs from data.mytables;
%let obs=&obs.;
select catx("_", "data", substr(memname, 6, 13), substr(memname,20,27))
into :setname1-:setname&obs.
from data.mytables;
quit;
%do i=1 %to &obs.;
data &&setname&i
set &&setname&i
if bid_price= '.' then delete;
%end;
%mend test;
然而,彻底失败了。谁能给我一些建议?我真的不擅长宏。错误包括:
- 56: 无法确定 LINE 和 COLUMN。
- ERROR 56-185: SET is not allowed in the DATA statement when option DATASTMTCHK=COREKEYWORDS.检查中是否缺少分号 DATA 语句,或使用 DATASTMTCHK=NONE.
您在 DATA 语句和 SET 语句中缺少分号,可能应该添加一个 运行 语句。建议你试试:
%do i=1 %to &obs.;
data &&setname&i ;
set &&setname&i ;
if bid_price= '.' then delete;
run;
%end;
注意DELETE语句是删除记录,不是删除变量。上面的代码期望 bid_price 是一个字符变量,并且当值为 '.' 时你想删除记录。