通过在SAS中用另一个前缀替换前缀来动态重命名变量
我有很多具有相同前缀的变量,我想用我选择的另一个前缀替换这个前缀,更具体地说,我的变量名为IPN_RAORAOR1。。。IPN_RAORAOR125 IPN_VOLVOLR17。。。等等,我想拿那些,我想拿的,我想拿的,我想拿的,我想拿的,等等。。。用IPN_RAO、IPN_VOL等替换它们我想在sas宏中处理它,因为我可能会在几十个其他数据集中多次遇到这个问题,现在我尝试了一些方法,但不是替换前缀,而是添加一个,如果你能帮我的话,那就太好了通过在SAS中用另一个前缀替换前缀来动态重命名变量,sas,prefix,Sas,Prefix,我有很多具有相同前缀的变量,我想用我选择的另一个前缀替换这个前缀,更具体地说,我的变量名为IPN_RAORAOR1。。。IPN_RAORAOR125 IPN_VOLVOLR17。。。等等,我想拿那些,我想拿的,我想拿的,我想拿的,我想拿的,等等。。。用IPN_RAO、IPN_VOL等替换它们我想在sas宏中处理它,因为我可能会在几十个其他数据集中多次遇到这个问题,现在我尝试了一些方法,但不是替换前缀,而是添加一个,如果你能帮我的话,那就太好了 %macro rename(inds,outds,v
%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);
您可以从sashelp.vcolumn获取数据集中的变量列表。这比转换空数据集更容易。此外,可以使用
catx()
在语句中直接创建宏变量“rename”
在下面,我为前缀列表中的每个元素创建了一个新的rename&I
宏变量。在我看来,这使代码更容易阅读。此外,我还将参数varlist
和prefixlist
分别重命名为oldprefexlist
和newprefixlist
。我认为这些名字更合适
%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);
如果某些变量是字符,则需要在PROC转置中使用VAR语句。天哪,我已经找了好几个小时的合适的解决方案,这太棒了,非常感谢你,这很简单,也很有效