加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

SAS  批量修改字段名称

(2016-01-12 18:51:37)
标签:

教育

财经

sas

分类: 03SAS数据处理
参考:http://bbs.pinggu.org/thread-1311391-1-1.html
          http://bbs.pinggu.org/thread-3656208-1-1.html  使用数组 array 


相关代码:点击下载

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);
 else  Variable_new=Variable ;

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;

  %do i = 1 %to 298;
    if geno&i.="NC" or missing(geno&i.) then delete;
  %end;

run;

%mend de_macro;


�_macro;



%macro rename2;

%do i = 2 %to 299;
 &&new&i.=&&var&i
%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,但是,由于变量类型不同(有的是字符型,有的是数字型,有的是日期型),所以好像不行。

恳请各位帮忙解答,非常感谢!

批量获取变量名,然后批量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;



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 test;
        format id v1 8. v2 $10. v3 date9.;
        id = 1;
        v1 = 2;
        v2 = 'a';
        v3 = "01Jan2012"d;
run;


%MACRO renamall(libref, dataset, prefix); 
  %LOCAL namelist i ; 
PROC CONTENTS DATA=&libref..&dataset OUT=dumm9999; 
RUN; 
PROC SQL STIMER NOPRINT; 
  SELECT name 
    INTO :namelist SEPARATED BY ' ' 
    FROM dumm9999 
 
QUIT; 
PROC DATASETS NOLIST LIBRARY=&libref; 
  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; 
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; 
  set xx(rename=(&rnmlist)); 
proc print; 
run;


quit;



%Macro Rename(Lib,Dset,Start,Last) ; 
    %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)) ; 
%Mend ; 


%Rename(work,test,1,2) 






data a;
  array a(27);
  array ab3_d(100);
  array xyz(55);
run;

%macro get_name(lib=,memname=,suffix=);
   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
verify(substr(name,length(name)-length("&suffix"),1),'01234567890')
      ;

        %let n_vars = &sqlobs;

      select name, value
        from sashelp.vmacro
       where name eqt 'N_'
       order by name
      ;
   quit;
%mend;

%get_name(lib=work,memname=test,suffix=2);





0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有