2016-04-04 11 views
1

Aşağıda SAS kodum var ve sonra da çalıştırabilir. Zorluk, onları defalarca tekrarlamak zorundayım ve gerçekten garip görünüyor. Trans1-Tran2, TransOut1-TransOut100'e ihtiyacım var ve BBB, AAA, VCS kullanıcı tanımlı ve takip edilecek bir trend yok.SAS kodu, döngü endeksi ve daha fazlası, nasıl basitleştirilir

%transform(Trans1,BBB,TransOut1); 
%transform(Trans2,AAA,TransOut2); 
%transform(Trans3,VCS,TransOut3); 
%transform(Trans4,REM,TransOut4); 

ben döngü yapmak birleştirmek ve benim kodunda tara düşünüyorum, ancak bu yüzden benim fikri test edemez değişken adında bir dizin nasıl kullanılacağını bilmiyorum. Çalışamayan örnek kod.

%macro test(data, var); 
Data &data.; 
Fname= "John"; 
Phone= 123; 
City="Chicago"; 
Zip=65456; 
keep &var.; 
Run; 
%mend; 


%test(test1, Phone); 
%test(test2, Fname); 
%test(test3, City); 
%test(test4, Zip); 

cevap

2

Neredeyse doğru zaten var:

%let second= BBB, AAA, VCS,REM;  
%macro trans; 
%do i=1 %to 4; 
%transform(Trans(i)?,%scan(&second.,&i),TransOut(i); 
%end; 
%mend; 

Aşağıda bazı test kodu gönderin. (Listenizdeki virgülü en iyi şekilde bırakın).

Uzun bir liste ile ilgili varsa
%let second= BBB AAA VCS REM;  
%macro trans; 
%do i=1 %to 4; 
%transform(Trans&i,%scan(&second.,&i),TransOut&i); 
%end; 
%mend; 

, çağrı yürütmek kullanmayı düşünmelisiniz:

data init; 
    input index userDef $; 
    datalines; 
1 AAA 
2 BBB 
3 VCS 
4 REM 
; 
run; 

data _null_; 
    set init; 
    call execute(
       cats(
        '%transform(Trans', index, ',', userDef, ',TransOut', index,')' 
        ) 
       ); 
run; 

düzenleme: kullanarak kediler artık Jetzler cevabı yanı sıra Joe

+3

"Kediler" için çok daha iyi gerçek çağrı tüm sıkıştırma funcitons ve '' 'operatörler daha yürütmek, ancak aksi takdirde bu iyidir. – Joe

+0

Evet, haklısınız. Kodu uygun şekilde düzenleyeceğim. – Jetzler

0

önerdiği gibi, Durumunuza bağlı olarak, döngülerinizi makroya dahil etmek daha kolay olabilir:

%let trans = trans1 trans2 trans3 trans4; 
%let trips = aaa bbb rem vcs; 
%let outs = transout1 transout2 transout3 transout4; 

%macro transform; 

    %do i = 1 %to %sysfunc(countw(&trans.)); 
     %do j = 1 %to %sysfunc(countw(&trips.)); 
      %do k = 1 %to %sysfunc(countw(&outs.)); 

       /*your code here*/ 

      %end; 
     %end; 
    %end; 

%mend transform; 

%transform;