2016-07-21 11 views
0

私は以下の変数を持っています:A_Bldg B_Bldg C_Bldg D_Bldg。 でそれらを掛け、その結果を新しい変数Sale_iに保存したいと思います。たとえば、A_Bldg * INTSF = Sale_A,B_Bldg * INTSF = Sale_Bなどとなります。変数をループして結果を格納するマクロSAS

私のコードは次のとおりです。

%macro loopit(mylist); 
%let n=%sysfunc(countw(&mylist)); 
%do J = 1 %to &n; 
%let i = %scan(&mylist,&J); 

    data test; 
    set data; 
    sale_&i. = &i._Bldg * INTSF; 
    run; 

%end; 
%mend; 

%let list = A B C D; 
%loopit(&list); 

これは、リスト内の最後の文字である、Sale_Dを生成します。 Sales A-Cを表示させるにはどうすればよいですか?最初の4行のコードは、テキストA〜Dをループすることができるためです。私は配列でそれをすることを考えましたが、A-Dインジケータに基づいて変数を選択する方法はわかりませんでした。ご協力いただきありがとうございます!

答えて

1

あなたは現在、リストをループして毎回testデータセットを再作成していますので、最後の反復のみを表示しているため、sale_dと表示されます。

あなたはあなたの問題を解決するために一つのデータステップであなたのリストをスキャンすることによって、あなたのループをクリーンアップすることができます。

%let list = A B C D; 

%macro loopit; 

    data test; 
     set data; 
      %do i = 1 %to %sysfunc(countw(&list.)); 
      %let this_letter = %scan(&list., &i.); 
       sale_&this_letter. = &this_letter._Bldg * INTSF; 
      %end; 
    run; 

%mend loopit; 

%loopit; 
+0

これは機能しました。ご協力いただきありがとうございます! – user3910919

1

あなた%DOループが間違った場所にあります。しかし実際には、ネイティブSASコードがすでに行うことができる何かをマクロコードを使用して行う必要はありません。

data want; 
    set have ; 
    array in A_Bldg B_Bldg C_Bldg D_Bldg ; 
    array out sale_1-sale4 ; 
    do i=1 to dim(in); 
    out(i)=intsf*in(i); 
    end; 
run; 
関連する問題