SAS 批量修改字段名称
(2016-01-12 18:51:37)
标签:
教育财经sas |
分类: 03SAS数据处理 |
参考:http://bbs.pinggu.org/thread-1311391-1-1.html
else Variable_new=Variable
;
%do i = 1 %to 298;
if geno&i.="NC" or
missing(geno&i.) then delete;
%end;
&&new&i.=&&var&i
format id
v1 8. v2 $10. v3 date9.;
id =
1;
v1 =
2;
v2 =
'a';
v3 =
"01Jan2012"d;
%LOCAL
namelist i ;
SELECT
name
INTO :namelist SEPARATED BY '
'
FROM
dumm9999
;
MODIFY
&dataset;
RENAME
%LET i =
1;
%LET
token =
%SCAN(&namelist,&i);
%DO
%WHILE(%LENGTH(&token));
&token =
&token&prefix.
%LET i = %eval_r(&i +
1);
%LET token =
%SCAN(&namelist,&i);
%END;
;
RUN;
set
xx(rename=(&rnmlist));
%Let Dsid =
%SysFunc(Open(&Lib..&Dset,I))
;
Proc Datasets Lib=&Lib NoList
;
Modify
&Dset ;
%Do
I=&Start %TO &Last ;
%Let OldName =
%SysFunc(VarName(&Dsid,&I))
;
%Let NewName = M_&OldName
;
Rename &OldName = &NewName
;;
%End
;
Run
;
Quit ;
%Let RC = %SysFunc(Close(&Dsid))
;
array
a(27);
array
ab3_d(100);
array
xyz(55);
proc sql;
select name into :N_1 -
:N_9999
from
sashelp.vcolumn
where libname =
%upcase("&lib")
and memname =
%upcase("&memname")
and reverse("&suffix")
eqt
left(reverse(name))
and
length(trim(name)) >
length("&suffix")
and
;
%let
n_vars = &sqlobs;
select name,
value
from
sashelp.vmacro
where name
eqt 'N_'
order by
name
;
quit;
相关代码:点击下载
DM LOG 'CLEAR'; DM OUTPUT 'CLEAR';
libname dd "f:\";
data one;
set dd.gene_smoking;
drop genotype_rs12312710;
run;
ods listing close;
ods output position = list;
proc contents data = one varnum;
run;
ods listing;
data list ;
set list;
obs=put((_n_-1),3.);
if _n_ >1 and _n_<300 then
Variable_new=compress(substr(Variable,1,4)||obs);
run;
proc sql noprint ;
select put(max(num), 3.) into :num from list;
select variable into :var1-:var&num from list;
select variable_new into :new1-:new&num
from list;
quit;
%macro rename;
%do i = 2 %to 299;
&&var&i = &&new&i.
%end;
%mend rename;
proc datasets lib = work;
modify one;
rename %rename;
run;
quit;
%macro de_macro;
data two;
set one;
run;
%mend de_macro;
�_macro;
%macro rename2;
%do i = 2 %to 299;
%end;
%mend rename2;
proc datasets lib = work;
modify two;
rename %rename2;
run;
quit;
人大经济论坛的问题与解决方案:
请教各位:如何在SAS中批量修改变量名,
例如:变量名分别为V1,V2,V3........V50这50个变量,如果需要将其RENAME为V1_N,V2_N,V3_N......V50_N,该如何操作呢?
因为有多个数据库,其变量的命名方式都是一样的,为了不至于合并的时候造成差错,因此,希望能通过RENAME来重命名,而且每个不同数据库新的变量名方式不同,可以识别是哪个数据库来的变量。
因为变量个数很多,所以不想一个个rename,不知道有没有简单的方法?
尝试用ARRAY,但是,由于变量类型不同(有的是字符型,有的是数字型,有的是日期型),所以好像不行。
恳请各位帮忙解答,非常感谢!
例如:变量名分别为V1,V2,V3........V50这50个变量,如果需要将其RENAME为V1_N,V2_N,V3_N......V50_N,该如何操作呢?
因为有多个数据库,其变量的命名方式都是一样的,为了不至于合并的时候造成差错,因此,希望能通过RENAME来重命名,而且每个不同数据库新的变量名方式不同,可以识别是哪个数据库来的变量。
因为变量个数很多,所以不想一个个rename,不知道有没有简单的方法?
尝试用ARRAY,但是,由于变量类型不同(有的是字符型,有的是数字型,有的是日期型),所以好像不行。
恳请各位帮忙解答,非常感谢!
批量获取变量名,然后批量rename 使用宏变量来实现
1.get namelist
2. generate the rename code such as
proc datasets lib=lib;
modify table;
rename
%let i=1;
%let name=%scan(&namelist.,&i.);
%do
%while(%length(&name.));
&name.=&name._N
%let i=%eval_r(&i+1);
%let name=%scan(&namelist.,&i.);
%end;
;
quit;
1.get namelist
2. generate the rename code such as
proc datasets lib=lib;
modify table;
rename
%let i=1;
%let name=%scan(&namelist.,&i.);
%let i=%eval_r(&i+1);
%let name=%scan(&namelist.,&i.);
;
quit;
Try the contents procedure, and I provided an example
here.
data test01;
format id v1 8. v2 $10. v3
date9.;
id = 1;
v1 = 2;
v2 = 'a';
v3 = "01Jan2012"d;
run;
proc contents data = test01 out = test02(keep = name) noprint; run;
proc sql noprint;
select compress(name||'='||name||'_n')
into:renames separated by ' '
from test02
where lowcase(name) ne
'id';
quit;
data test03;
set
test01(rename=(&renames.));
run;
data test01;
run;
proc contents data = test01 out = test02(keep = name) noprint; run;
proc sql noprint;
quit;
data test03;
run;
data
test;
run;
%MACRO renamall(libref,
dataset, prefix);
PROC CONTENTS
DATA=&libref..&dataset
OUT=dumm9999;
RUN;
PROC SQL STIMER
NOPRINT;
QUIT;
PROC DATASETS NOLIST
LIBRARY=&libref;
QUIT;
%MEND;
%renamall(work,test,_N)
data
xx;
a=1; b=2; c=3;
d=4;
proc sql
noprint;
select
compress(name||"=M_"||name) into : rnmlist
separated by ' '
from
dictionary.columns
where libname='WORK' and
memname='XX'
;
data
xx;
proc
print;
run;
quit;
%Macro
Rename(Lib,Dset,Start,Last) ;
%Mend
;
%Rename(work,test,1,2)
data a;
run;
%macro
get_name(lib=,memname=,suffix=);
verify(substr(name,length(name)-length("&suffix"),1),'01234567890')
%mend;
%get_name(lib=work,memname=test,suffix=2);
前一篇:刍议:2SLS两阶段最小二乘法
后一篇:STATA 缺失值的处理