批量替换字段名称后缀

  • 本文关键字:后缀 字段 替换 sas
  • 更新时间 :
  • 英文 :


>我有一个数据集,其中我有几个变量,其后缀对应于给定的日期。我想用日期替换后缀,以使我的输出表更加用户友好。

这是我的代码示例

我的sales数据集中的字段是productnumber_of_sales_1number_of_sales_2number_of_sales_3revenue_1revenue_2revenue_3tax_1tax_2tax_3

后缀 1,2,3 对应于第二个数据集中保存的日期,格式如下

dates

iddate

101Apr

201May

301Jun

我想将后缀批量替换为日期,以便我在sales中的字段变为

productnumber_of_sales_01Aprnumber_of_sales_01Maynumber_of_sales_01Junrevenue_01Aprrevenue_01Mayrevenue_01Juntax_01Aprtax_01Maytax_01Jun

sales中的日期数和指标数都是动态的,所以我不能只在代码中进行硬编码。

我假设你的数据集如下所示:

data sales;
product="abc";number_of_sales_1=1;number_of_sales_2=2;number_of_sales_3=3;
revenue_1=1000;revenue_2=2000;revenue_3=3000;tax_1=100;tax_2=200;tax_3=300;
run;
data dates;
id=1;date="01Apr";output;id=2;date="01May";output;id=3;date="01Jun";output;
run;
  • 第一步 - 找出需要重命名的日期变量

proc contents data=sales out=sales_temp(keep=name) noprint;  run;
data sales_temp1;
length check_date_vars $1. id 8.;
set sales_temp;
check_date_vars=compress(substr(name,length(name)));
temp=notdigit(check_date_vars);
if temp=0 then id=check_date_vars;
run;
  • 第二步 - 将上述数据集与包含格式的 datset 合并,以创建旧名称和新名称之间的映射,并从中创建宏变量

proc sort data=sales_temp1;    by id;    run;
proc sort data=dates;    by id;    run;
data sales_temp_date;
merge sales_temp1(in=a) dates(in=b);
by id;
if a and b;
new_name=substr(name,1,length(name)-1)||date;
run;
proc sql noprint;
select count(*) into :num_vars separated by " " from sales_temp_date;
quit;
proc sql noprint;
select name into:old_name1 - :old_name&num_vars.  from sales_temp_date;
select new_name into:new_name1 - :new_name&num_vars. from sales_temp_date;
quit;
  • 第三步 - 重命名变量

%macro rename();
proc datasets library=work nolist;
modify sales;
rename 
%do i=1 %to &num_vars.;
&&old_name&i.= &&new_name&i.
%end;
;
run;
%mend;
%rename;

最新更新