Macros 使用另一个数组中的名称重命名数组中的变量

Macros 使用另一个数组中的名称重命名数组中的变量,macros,sas,Macros,Sas,我试图根据一个数组元素按如下方式重命名变量 %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),',','

我试图根据一个数组元素按如下方式重命名变量

%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; 
运行

我想将新变量重命名为第一个数组elemets

日志:


不幸的是,
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);

如果这些字符变量的长度太大,您可能会遇到问题。新变量可能被截断。您必须对此进行修改,以添加
长度
语句。

您不能在重命名语句中使用函数。在开始使用宏变量或宏代码生成SAS代码之前,请写出要生成的SAS代码。向我们展示您试图生成的SAS代码。我认为标题正是他想要的——他想用另一个数组中的名称重命名数组中的变量。数据步骤中的代码对于问题来说是多余的。@DomPazz ya你是对的。我想我会改变这个问题。在sascommunities网站上投票表决我的新增强请求。据我所知,在输出数据集级别重命名是有效的。本文中的语法之所以有效,是因为它生成了要重命名的新旧变量对的完整列表。这将在常规RENAME语句中或通过在输出数据集上使用RENAME=dataset选项来实现。
%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);