2017-10-06 45 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