通过在 SAS 中用另一个前缀替换前缀来动态重命名变量

Posted

技术标签:

【中文标题】通过在 SAS 中用另一个前缀替换前缀来动态重命名变量【英文标题】:Renaming variables dynamically by replacing a prefix with another prefix in SAS 【发布时间】:2020-07-31 14:04:03 【问题描述】:

我有很多具有相同前缀的变量,我想用我选择的另一个前缀替换这个前缀,更具体地说,我的变量命名为 IPN_RAORAOR1 ... IPN_RAORAOR125 IPN_VOLVOLR17 ... IPN_VOLVOLR46 等等我想把那些 IPN_RAORAO、IPN_VOLVOL 等替换为 IPN_RAO、IPN_VOL 等但不是替换前缀而是添加一个,如果你能帮助我,那就太好了

%macro rename(inds,outds,varlist,prefixlist);

%local i vars prefix namelist renames;

%do i=1 %to %sysfunc(countw(&varlist,%str( )));
    %let vars=%scan(&varlist,&i,%str( ));
    %let prefix=%scan(&prefixlist,&i,%str( ));
    proc transpose data=&inds(obs=0 keep=&vars) out=names; run;
    proc sql noprint;

    select _name_ into : namelist separated by ' ' from names;
    quit;

    %let renames= %rename(vars=&namelist,prefix=&prefix);
    %end;

    data &outds;
    set &inds(rename=(&renames));
    run; 

%mend ; 

%rename(inds=test, outds=test2, varlist = IPN_AFFAFF: IPN_RAORAO: 
IPN_VOLVOL:, prefixlist =IPN_AFFR IPN_RAO IPN_VOL);   

【问题讨论】:

如果某些变量是字符,您需要在 PROC TRANSPOSE 中使用 VAR 语句。没有,只使用数字变量。 【参考方案1】:

您可以从 sashelp.vcolumn 获取数据集中的变量列表。这比转置空数据集更容易。此外,可以使用catx()into: 语句中直接创建宏变量“renames”。

在下面,我为前缀列表中的每个元素创建了一个新的renames&i 宏变量。在我看来,这使代码更容易阅读。另外,我将参数varlistprefixlist 分别重命名为oldprefixlistnewprefixlist。我觉得这些名字更合适。

%macro rename(inds,outds,oldprefixlist,newprefixlist);

   * For each pair of old and new prefixes, make a list of variables that should be renamed;
   %do i=1 %to %sysfunc(countw(&oldprefixlist,%str( )));
      proc sql noprint;
         select catx('=',name,tranwrd(name,"%scan(&oldprefixlist,&i,%str( ))","%scan(&newprefixlist,&i,%str( ))"))
            into :renames&i. separated by ' '
         from sashelp.vcolumn
         where libname='WORK' 
           and memname=upcase("&inds.")
           and index(upcase(name),upcase("%scan(&oldprefixlist,&i,%str( ))")) = 1
         ;
      quit;
   %end;

   * Make the output dataset including renamed variables;
   data &outds;
      set &inds;
      rename 
      %do i=1 %to %sysfunc(countw(&oldprefixlist,%str( )));
         &&renames&i.
      %end;;
   run; 

%mend; 


* Try it out with testdata;
data test;
input ipn_affaff1 $ ipn_raoraor1 ipn_raoraor125 $ ipn_volvolr17 $ ipn_volvolr46 $;
datalines;
a 1 b c d 
e 2 f g h
;
run;

%rename(inds           = test
       ,outds          = test2
       ,oldprefixlist  = ipn_affaff ipn_raorao ipn_volvol
       ,newprefixlist  = ipn_aff ipn_rao ipn_vol);

【讨论】:

天哪,我已经找了几个小时的合适解决方案,这太棒了,非常感谢,这既简单又有效

以上是关于通过在 SAS 中用另一个前缀替换前缀来动态重命名变量的主要内容,如果未能解决你的问题,请参考以下文章

项目实战:Qt文件改名工具 v1.2.0(支持递归检索,搜索:模糊匹配,前缀匹配,后缀匹配;重命名:模糊替换,前缀追加,后缀追加)

项目实战:Qt文件改名工具 v1.2.0(支持递归检索,搜索:模糊匹配,前缀匹配,后缀匹配;重命名:模糊替换,前缀追加,后缀追加)

Pandas:有没有办法使用“droplevel”之类的东西,并且在处理过程中,使用删除的级别标签作为前缀/后缀重命名另一个级别?

在 Windows 中将多个文件的前缀重命名或删除为每个文件的编号

COM Interop的重命名/前缀类

通过添加前缀 -in R 重命名数据框的列