您应该已经看到循环中的 last 变量名(所以第 6 个)发生了变化。这是因为您使用相同的源数据集但不同目标重复了相同的数据步骤 - 所以每次您“忘记”在前面步骤中所做的更改。
所以,这会奏效,不过我会在稍后解释为什么这不是一个好方法。
%Let t1=12Mth;
%Let t2=20;
%Let t3=30;
%Let t4=40;
%Let t5=50;
%Let t6=60;
%macro Re(time);
%Do I = 1 %to &time.;
data Milk;
set Milk;
rename MT&&t&I..Sp=MTSp&&t&I.;
run;
%end;
%mend Re;
data milk;
input
MT12mthSP
MT20SP
MT30SP
MT40SP
MT50SP
MT60SP
;
datalines;
12 20 30 40 50 60
;;;;
run;
%Re(6)
在这里,我让它对Milk 进行所有更改并将它们保存回该数据集中。如果你想保留Milk,那么首先创建Milk_New,然后在set 和data 语句中都有它。
其次,您不应为每次更改都执行新的数据步骤。宏不必在其中包含数据步骤;它们可以在数据步中运行。
例如:
%macro Re(time);
%Do I = 1 %to &time.;
rename MT&&t&I..Sp=MTSp&&t&I.;
%end;
%mend Re;
data milk_new;
set milk;
%Re(6);
run;
完全在宏之外生成此列表会更好 - 查找“生成代码 SAS”以获取有关建议。
如果您根本没有看到任何重命名,您也可能会遇到列上存在标签的问题。这不会影响您对变量名的使用,但会让人感到困惑。使用
label _all_;
或者在你的宏循环中包含一个标签清除语句(label <varname>;,你在重命名之前弹出与 original 变量名相同的变量名)来解决这个问题。