SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 1984|回复: 8
打印 上一主题 下一主题

不同数据集变量重命名

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2011-8-19 20:44:26 | 只看该作者

不同数据集变量重命名

有三个数据集,其变量名都是x1-x40,但是具体的取值或变量类型均不同,现目的是:
给数据集一的变量 x1-x40,统统加一个后缀,变为x1_a-x40_a;
    数据集二的变量 x1-x40,统统加一个后缀,变为x1_b-x40_b;
    数据集一的变量 x1-x40,统统加一个后缀,变为x1_c-x40_c;
期待大侠回复!!
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2011-8-19 21:24:25 | 只看该作者

Re: 不同数据集变量重命名

用ARRAY试一试
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2011-8-20 10:25:35 | 只看该作者

Re: 不同数据集变量重命名

求具体的sas code,先谢了。。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2011-8-20 11:18:54 | 只看该作者

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]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
5#
 楼主| 发表于 2011-8-30 00:02:51 | 只看该作者

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]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
6#
 楼主| 发表于 2011-8-31 11:41:29 | 只看该作者

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!!
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
7#
 楼主| 发表于 2012-8-9 10:19:18 | 只看该作者

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]
一是生成的数据集不能覆盖原数据集;
二是可灵活选择变量类型的;
此外还有想不到的其他灵活操作。
期待各位的回复!!
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
8#
 楼主| 发表于 2012-9-16 10:50:58 | 只看该作者

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)
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
9#
 楼主| 发表于 2012-9-20 17:41:06 | 只看该作者

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]
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|SAS中文论坛  

GMT+8, 2025-6-8 14:46 , Processed in 0.080543 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表