全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
3097 3
2011-06-04
感谢之前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);
二维码

扫码加我 拉你入群

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

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

全部回复
2011-6-4 06:47:04
proc sort data=&dataset out=&dataset nodup; /*鄙人理解的是剔除完全重复变量*/
是删除完全重复的变量, 有条件的删除可以试试set &dataset; %if &var<=0  %then delete...

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*/

直接命名可以用 let var=%scan ( &name, &number);  let newname=bsize_&number;
proc sql; select &var as &newname from &dataset; 或者不怕麻烦就全部输入新的变量, select old as new....

以上程序list里边的memname就是数据集的名字, proc sql; select count(memname) from list; 可以知道数据集的个数.
二维码

扫码加我 拉你入群

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

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

2011-6-4 09:52:56
其实我们讨论的全是对于观测的处理~~~~~~~~
鄙人愚钝,还是不太明白
1 用set &dataset; %if &var<=0  %then delete..有条件的删除观测,加到哪个地方呢?
2直接命名可以用 let var=%scan ( &name, &number);  let newname=bsize_&number;
proc sql; select &var as &newname from &dataset; 或者不怕麻烦就全部输入新的变量, select old as new....
还是使用您说的全部输入吧,直接rename即可?
3 proc sql; select count(memname) from list;中如何向set %do i=1 %to &setnum中的setnum赋值呢?
是proc sql; select setnum=count(memname) from list;还是proc sql; select count(memname) from list;setnum=count(memname)呢?
鄙人太笨,抱歉啊
O(∩_∩)O谢谢.
二维码

扫码加我 拉你入群

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

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

2011-6-4 09:57:25
再加上一句,鄙人是想将同一个文件夹下的所有数据集纵向合并,
data qiao.all;
set %do i=1 %to 数据集个数;
    qiao.data&i.
        %end;;
run;
二维码

扫码加我 拉你入群

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

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

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

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