SAS中文论坛

标题: 不同数据集变量重命名 [打印本页]

作者: shiyiming    时间: 2011-8-19 20:44
标题: 不同数据集变量重命名
有三个数据集,其变量名都是x1-x40,但是具体的取值或变量类型均不同,现目的是:
给数据集一的变量 x1-x40,统统加一个后缀,变为x1_a-x40_a;
    数据集二的变量 x1-x40,统统加一个后缀,变为x1_b-x40_b;
    数据集一的变量 x1-x40,统统加一个后缀,变为x1_c-x40_c;
期待大侠回复!!
作者: shiyiming    时间: 2011-8-19 21:24
标题: Re: 不同数据集变量重命名
用ARRAY试一试
作者: shiyiming    时间: 2011-8-20 10:25
标题: Re: 不同数据集变量重命名
求具体的sas code,先谢了。。
作者: shiyiming    时间: 2011-8-20 11:18
标题: Re: 不同数据集变量重命名
sorry,前面的回应有点离谱.下面的代码是我google到的,这下应该没有会错意.[code:124uqmac]data test;
   input x1-x40 @@;
   cards;
1 2 3 3 6 4 7 4 5 6
7 4 8 8 9 7 8 9 7 8
9 6 3 7 5 6 4 5 6 4
2 5 4 5 2 3 4 5 2 3
;
run;
%macro ren(lib=,ds=);
%let lib=%upcase(&lib);
%let ds= %upcase(&ds);
proc sql;
   create table new as
   select name
   from sashelp.vcolumn
   where libname="&lib" and memname="&ds";
quit;
data _null_;
   set new;
   call symput("no",_n_);
   call symput("n"!!compress(put(_n_,8.)),compress(name));
run;

proc datasets lib=&lib;
    modify &ds;
    rename
       %do i=1 %to &no;
       &&n&i = &&n&i.._a
       %end;
    ;
run;
quit;
%mend;
%ren(lib=work,ds=test);

[/code:124uqmac]
作者: shiyiming    时间: 2011-8-30 00:02
标题: Re: 不同数据集变量重命名
[quote:3ezwxjsu]data a;
input x1 - x40;/*nomatter the variables type is*/
cards;
1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0
;
data b;
input x1 - x40;
cards;
1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0
;
data c;
input x1 - x40;
cards;
1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0
;
run;

%macro d(d=,v=);
%do i=1 %to 40;
proc datasets lib=work mt=data nolist;
  modify &d.;
rename x&i.=x&i._&v.;
run;
quit;
%end;%end;
%mend;
%d(d=a,v=a)
%d(d=b,v=b)
%d(d=c,v=c)[/quote:3ezwxjsu]
作者: shiyiming    时间: 2011-8-31 11:41
标题: Re: 不同数据集变量重命名
[quote="gogotiger":2i406tyj][quote:2i406tyj]data a;
input x1 - x40;/*nomatter the variables type is*/
cards;
1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0
;
data b;
input x1 - x40;
cards;
1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0
;
data c;
input x1 - x40;
cards;
1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0
;
run;

%macro d(d=,v=);
%do i=1 %to 40;
proc datasets lib=work mt=data nolist;
modify &d.;
rename x&i.=x&i._&v.;
run;
quit;
%end;%end;
%mend;
%d(d=a,v=a)
%d(d=b,v=b)
%d(d=c,v=c)[/quote:2i406tyj][/quote:2i406tyj]

good work and thanks for gogotiger!!
作者: shiyiming    时间: 2012-8-9 10:19
标题: Re: 不同数据集变量重命名
to gogotiger and other_big_man,
在网上搜索了下,在一篇blog中发现的code,
[code:2mux6t9z]%macro renamevar(dslib,dsname,prefix,suffix,fromnum,tonum) ;
ods   listing close;
ods trace on;
ods output variables=varlist  ;
proc contents data=&dslib..&dsname;
run;
ods trace off;
ods listing;

proc sql;
  select  cats(variable,"=","&prefix._",variable,"_&suffix")
            into :renamelist  separated by " "
from  varlist
where num between &fromnum and &tonum;
quit;

proc datasets lib=&dslib ;
  modify  &dsname;
  rename &renamelist;
run;
%mend renamevar;

%renamevar(sashelp,class,pre,suf,3,5);
[/code:2mux6t9z]
此语句有其本身的缺陷,
一是生成的数据集覆盖了原数据集;
二是对字符型变量与数值型变量分开进行了操作,或者说对字符串型没有操作;
[color=#FF0000:2mux6t9z]现有两目的::[/color:2mux6t9z]
一是生成的数据集不能覆盖原数据集;
二是可灵活选择变量类型的;
此外还有想不到的其他灵活操作。
期待各位的回复!!
作者: shiyiming    时间: 2012-9-16 10:50
标题: Re: 不同数据集变量重命名
data a;
input x1 - x40;/*nomatter the variables type is*/
cards;
1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0
;
data b;
input x1 - x40;
cards;
1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0
;
data c;
input x1 - x40;
cards;
1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0
;
run;

%macro changevarnames(d=,v=);
data &d&d;
set &d;
%do i=1 %to 40;
rename x&i.=x&i._&v.;
%end;
run;
%mend;
%changevarnames(d=a,v=a)
%changevarnames(d=b,v=b)
%changevarnames(d=c,v=c)
作者: shiyiming    时间: 2012-9-20 17:41
标题: Re: 不同数据集变量重命名
[code:3vcxmi1f]
data test;
   input x1-x40 @@;
   cards;
1 2 3 3 6 4 7 4 5 6
7 4 8 8 9 7 8 9 7 8
9 6 3 7 5 6 4 5 6 4
2 5 4 5 2 3 4 5 2 3
;
run;

%macro changed(ds,postfix);

proc contents data=&ds out=tds noprint;
run;

data ads;
set tds(keep=name);
cname=trim(name)!!"&postfix";
cat=strip(name)!!'='!!strip(cname);
run;

proc sql noprint;
  select cat into :mcname separated by ' '
  from ads;
quit;

data wanted&postfix;
set &ds;
rename &mcname;
run;

%mend;
%changed(test,_a)
%changed(test,_b)
%changed(test,_c)
[/code:3vcxmi1f]




欢迎光临 SAS中文论坛 (http://mysas.net/forum/) Powered by Discuz! X3.2