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);