感谢之前sas_user同学的解答,万分感谢O(∩_∩)O哈!
现在想更加specific一点……O(∩_∩)O~
想使用SAS宏做如下的工作:
对一个文件夹下的所有数据集,进行变量重命名(rename)排序(retain)删除重复观测和一些特定的观测
之后用set把它们合并起来
具体:
将变量重命名为不同的名称(不是var#,原来变量名忘记了,⊙﹏⊙b汗,快要拿到数据了,先准备好),变为Stock_code Tprice Trade_Volume Amount Volume Bprice_1
Bprice_2 Bprice_3 Bprice_4 Bprice_5 Bsize_1 Bsize_2 Bsize_3 Bsize_4 Bsize_5 Aprice_1 Aprice_2 Aprice_3 Aprice_ 4 Aprice_5 Asize_1 Asize_2 Asize_3 Asize_4 Asize_5 Buysell_id;
删除 异常值,比如 Bprice_#<=0 Aprice_#<=0 Bsize_#<=0 Asize_#<=0 Tprice<=0 Volume<=0
删除重复值
改变变量顺序 retain~
用set把它们合并起来
以下是鄙人根据sas_user同学的程序,自己根据情况改编了一下,希望大家指点,看看鄙人的程序哪些错误哈:
%macro reset(lib=);
proc contents data=&lib._all_ out=sasuser.list;
run;
proc contents data=sasuser.list varnum; run;
proc sql;
select distinct memname into : ds separated by ' ' from sasuser.list;
select max(varnum) into : varnum separated by ' ' from sasuser.list group by memname;
quit;
%let number=1;
%do %while (%scan(&ds,&number) ne );
%let dataset=%scan(&ds,&number);
proc sort data=&dataset out=&dataset nodup; /*鄙人理解的是剔除完全重复变量*/
by _all_;
quit;
%let vn=%scan(&varnum,&number);
%do i=1 %to &vn;
proc sql;
select name into : name from sasuser.list where memname="&dataset" and varnum=&i;
quit;
proc datasets library=&lib;
modify &dataset;
rename &name=var&i;/*这里面,我想直接重命名,可以不用这种方法,即把所有的变量原来的名称改成Stock_code Tprice Trade_Volume Amount Volume Bprice_1
Bprice_2 Bprice_3 Bprice_4 Bprice_5 Bsize_1 Bsize_2 Bsize_3 Bsize_4 Bsize_5 Aprice_1 Aprice_2 Aprice_3 Aprice_ 4 Aprice_5 Asize_1 Asize_2 Asize_3 Asize_4 Asize_5 Buysell_id*/
retain Stock_code Tprice Trade_Volume Amount Volume Bprice_1
Bprice_2 Bprice_3 Bprice_4 Bprice_5 Bsize_1 Bsize_2 Bsize_3 Bsize_4 Bsize_5 Aprice_1 Aprice_2 Aprice_3 Aprice_ 4 Aprice_5 Asize_1 Asize_2 Asize_3 Asize_4 Asize_5 Buysell_id; /*再进行重排序*/
do i=1 to 5; /*再进行剔除错误值的工作~*/
if Bprice_i<=0 delete;
if Aprice_i<=0 delete;
if Bsize_i<=0 delete;
if Asize_i<=0 delete;
if Tprice<=0 delete;
if Volume<=0 delete;
quit;
%end;
%let number=%eval(&number+1);
%end;
data combine;
set %do i=1 %to &setnum;/*鄙人想利用setnum作为文件夹的数据集数量,不知道如何使用SAS来测算。如果没有的话,就自己数出一个数字了…………,但是还是希望使用宏O(∩_∩)O哈!*/
%end;
run;
%mend;
%reset (lib=WORK);