2017-11-30 16 views
0

작업 디렉토리에 저장된 특정 데이터 세트에서 데이터를 추출하고 간단한 방정식을 수행 할 수있는 proc IML 코드를 작성했습니다. 결과는 새 데이터 세트에 저장됩니다.여러 데이터 세트에서 동일한 SAS 절차 수행 방법

proc iml ; 
use B1; 
read all var _ALL_ into B1; 
close B1; 

g= B1[1,1]; 
ExG = B1[3,1]; 
Res = B1[5,1]; 
E =2; 
R =3; 

test = g/(g+(ExG/E)+(Res/(R*E))); 

print g ExG res test [format = 10.6]; 
create try var {g ExG res test}; 
append; 
close try; 

run; quit; 

이제 SAS 작업 폴더에 저장된 여러 데이터 세트에이 절차를 적용하고 결과를 새 폴더에 결합하여 추가하고 싶습니다. 데이터 세트는 B1, B2, B3으로 코딩되어 있습니다 ... 루프 기능이있는 SAS 매크로가 필요하지만이 분야에 대한 지식은 매우 제한적입니다. 나는 어떤 도움을 주셔서 감사합니다.

+0

IML을 사용하는 이유가 있습니까? 각 테이블에서 세 개의 스칼라 값을 사용하는 것처럼 보이므로 행렬 언어를 사용하는 이유를 모르겠습니다. 매크로를 사용하여 원하는 텍스트를 생성 할 수 있으므로 쉽게 IML 코드를 생성 할 수 있습니다. 그러나 IML 자체가 원하는 경우 코드를 생성하는 데 사용할 수 있다고 생각합니다. – Tom

+0

링크 된 복제본은 "데이터 단계"이지만 개념은 여전히 ​​IML에 광범위하게 적용됩니다. 해당 질문/답변을 살펴본 후 문제를 해결하는 데 어려움이 있으면 새로운 질문을 고려하십시오. 처음부터 매크로를 만드는 것까지, 당신은 그것을하기 위해 당신 자신에 관한 약간의 조사를하고 싶을 것입니다. 그것은 너무 광범위합니다. – Joe

+0

@Tom : 코드와 좋은 설명에 대해 감사드립니다. 그것은 완벽하게 작동합니다. 기본적으로 필자는 IML을 사용하여 데이터를 추출하고 계산을 수행하는 가장 쉬운 방법이었으며 더 복잡한 작업으로 손쉽게 확장 할 수 있다고 생각합니다. – user3570605

답변

0

사실, 당신은 다음과 같이 쉽게 할 수있는 매크로 fonction를 사용할 수 있습니다

1) 빈 데이터 세트를 설정합니다

data result; 
run; 

2) 데이터 세트를 처리하는 매크로 fonction을 만듭니다. VAR 매크로 변수는 목록 B1, B2, B3, B4의 데이터 세트 수입니다.

%macro processDatasets(var); 

proc iml ; 
use B&var; 
read all var _ALL_ into B&var; 
close B&var; 
g= B&var.[1,1]; 
ExG = B&var.[3,1]; 
Res = B&var.[5,1]; 
E =2; 
R =3; 

여기서 호 symputx 값과 저장 ("g", B &을 VAR. [1,1], 'G'); 그런 다음 전역 매크로 변수를 데이터 집합 to_store에 추가하십시오.

call symputx("g", B&var.[1,1], 'G');. 
.... 

test = g/(g+(ExG/E)+(Res/(R*E))); 
print g ExG res test [format = 10.6]; 
create try var {g ExG res test}; 
append; 
close try; 
run; quit; 

매크로 변수를 현재 데이터 집합에 저장하는 방법은 다음과 같습니다.

data to_store; 
g=call symget("g"); 
ExG=call symget("ExG"); 
... 
run; 

3) 다음은 여러 데이터 집합을 결과 집합으로 연결하는 데 유용한 정보입니다.

data result; 
    set result to_store; 
run; 

%mend processDataset; 

4) 함수에 여러 호출을 수행 할 수 있습니다

%processDataset(1); 
%processDataset(2); 
%processDataset(3); 
... 

5) 또는 수의 목록을 수행 할 수 있습니다 루프 :

%macro processVarList; 
%let var_list=1|2|3|4; 
    %let k=1; 
    %do %while (%qscan(&var_list, &k,|) ne); 
     %let VAR = %scan(&var_list, &k,|); 
     %processDataset(&var); 
     %let k = %eval(&k + 1); 
    %end; 
%mend processVarList; 
%processVarList; 

6) 본을 적용 할 수 결과 데이터 세트에 저장하려는 코드 다음에 코드를 추가하십시오. 코드를 테스트하지는 않았지만 아이디어가 있습니다. 최종 결과 데이터 집합에 병합하려면 모든 변수 G, ExG, Res, E, R을 데이터 집합에 저장해야합니다.

결국 모든 결과 값을 결과 데이터 집합으로 가져옵니다.