与名来自另一个阵列
问题描述:
我想基于folloing方式一个数组元素重新命名变量,与名来自另一个阵列
%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.
答
不幸的是,在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
声明。
+0
这个作品,我明白,在输出重命名数据集级别。 – user3658367
+0
这篇文章中的语法工作原理是因为它生成了要重命名的旧=新变量对的完整列表。这既可以在常规的RENAME语句中使用,也可以在输出数据集上使用RENAME = dataset选项。 – Tom
您不能在RENAME语句中使用函数。在开始使用宏变量或宏代码生成SAS代码之前,请先写出要生成的SAS代码。向我们展示您尝试生成的SAS代码。 – Tom
我认为标题说明了他想要的东西 - 他想用另一个数组的名称重命名数组中的变量。数据步骤中的代码对于这个问题是多余的。 – DomPazz
@DomPazz你是对的,我想我会改变这个问题。 – user3658367