2017-10-06 8 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; 

실행에서 이름을 배열 변수의 이름을 변경;

새 변수의 이름을 첫 번째 배열 elemets로 바꾸고 싶습니다.

로그 :

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

이 게시물의 구문은 이름 바꾸기를 위해 old = new 쌍의 전체 목록을 생성하기 때문에 작동합니다. 이는 일반 RENAME 문 또는 출력 데이터 집합의 RENAME = dataset 옵션을 사용하여 작동합니다. – Tom