2017-10-06 44 views
1

我想基于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. 
+0

您不能在RENAME语句中使用函数。在开始使用宏变量或宏代码生成SAS代码之前,请先写出要生成的SAS代码。向我们展示您尝试生成的SAS代码。 – Tom

+0

我认为标题说明了他想要的东西 - 他想用另一个数组的名称重命名数组中的变量。数据步骤中的代码对于这个问题是多余的。 – DomPazz

+0

@DomPazz你是对的,我想我会改变这个问题。 – user3658367

回答

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声明。

+0

这个作品,我明白,在输出重命名数据集级别。 – user3658367

+0

这篇文章中的语法工作原理是因为它生成了要重命名的旧=新变量对的完整列表。这既可以在常规的RENAME语句中使用,也可以在输出数据集上使用RENAME = dataset选项。 – Tom