我试图以下面的方式重命名基于一个数组元素的变量,
%let var= class name gender;
data want;
set have;
%global noof;
array point(*)$ %str(&var) ;
a=dim(point);
call symputx('noof',a);
array newvar(&noof);
do i=1 to &noof;
newvar(i)=translate(point(i),',','.');
end;
drop &var;
do i=1 to &noof;
rename newvar(i)=vname(point(i));
end;
运行;
我想将新变量重命名为第一个数组元素。
LOG:
rename newvar(i)=vname(point(i));
-
22
76
ERROR 22-322: Syntax error, expecting one of the following: -, :, =.
ERROR 76-322: Syntax error, statement will be ignored.
答案 0 :(得分:1)
不幸的是,RENAME
语句的RHS值必须是文字。该语句在编译时进行评估,而不是在运行时进行评估。
试试这个:
%let var= class name gender;
%macro translate(datain,dataout,vars);
%local n i var;
%let n=%sysfunc(countw(&vars));
data &dataout(rename=(
%do i=1 %to &n;
%let var = %scan(&vars,&i);
newvar&i = &var
%end;
));
set &datain;
array invars(&n) $ &vars ;
array newvar(&n) $;
do i=1 to &n;
newvar(i)=translate(invars(i),',','.');
end;
drop &vars i;
run;
%mend;
data test;
class = "1,2,3";
name= "Dom,Pazzula";
gender="M";
run;
%translate(test,out,&var);
如果这些字符变量的长度太大,您可能会遇到问题。新变量可能会被截断。您必须对其进行修改才能添加length
语句。