我试图通过使用数组添加后缀来重命名变量列表。我的代码如下。我首先将旧变量列表和新变量列表生成为两个数组。然后,我遍历列表以重命名每个变量。我收到以下错误消息。怎么了?谢谢!
%let vars = tone1 tone2 tone3 fog reading kincaid flratio spec numint
uncert;
%let suffix = mda;
%put &vars;
%put &suffix;
/*Generate the variable lists*//
proc transpose data=test(obs=0) out=names;
var &vars;
run;
proc sql noprint ;
select _name_, cats(_name_,'_'&suffix)
into :old_list separated by ' ', new_list separated by ' '
from names;
quit;
%put &old_list;
%put &new_list;
data test;
set test;
array old[*] &old_list;
array new[*] &new_list;
do i=1 to dim(&old_list);
rename old[i] = new[i];
end;
run;
我收到以下错误消息:
1597 data test;
1598 set test;
1599 array old[*] &old_list;
1600 array new[*] &new_list;
1601 do i=1 to dim(&old_list);
NOTE: Line generated by the macro variable "OLD_LIST".
1 Tone1 Tone2 Tone3 Fog Reading Kincaid FLRatio SPEC NumInt Uncert
-----
388
76
1602 rename old[i] = new[i];
-
22
76
ERROR 388-185: Expecting an arithmetic operator.
ERROR 76-322: Syntax error, statement will be ignored.
ERROR 22-322: Syntax error, expecting one of the following: -, :, =.
1603 end;
1604 run;
答案 0 :(得分:3)
DIM()
函数需要一个数组名,而不是一个变量名列表。 RENAME
语句需要变量名,而不是数组引用。
只需将OLD = NEW对直接生成到一个宏变量中,以便您可以在RENAME语句中使用它。
proc sql noprint ;
select catx('=',_name_, cats(_name_,"_&suffix"))
into :rename_list separated by ' '
from names
;
quit;
proc datasets nolist lib=work;
modify test;
rename &rename_list;
run;
quit;
答案 1 :(得分:2)
rename
不是动态可执行语句。换句话说,在运行时的数据步骤不能添加或更改在自动编译时构建的程序数据向量(pdv)。
您选择让TRANSPOSE承担的角色是,每个var仅获得一行数据(确实很有趣)。
仅更改变量名的最终目标是使元数据比较适合Proc DATASETS
。重写整个数据集,仅更改列名就可以使用小数据,但是对于大数据集则不是一个好主意。
所以真正的任务是将以空格分隔的令牌列表更改为可以在重命名语句中使用的项<token>=<newtoken>
的新列表。
%let renamelist = %sysfunc(prxchange(s/(\w+)\b/$1=$1&SUFFIX/,-1,&VARS));
和
proc datasets nolist lib=work;
modify test;
rename &renamelist;
run; quit;