2017-07-06 5 views
0

私はSAS DIでカスタム変換を構築しようとしています。この変換は、入力データセットの列に対して「作用」し、所望の出力を生成する。簡略化のために、を使用して,input_col2を計算してoutput_col2を計算し、指定された数の列を処理するとします(2としましょう)。SASでインデックス付き割り当て変数を動的に選択する方法は?

カスタム変換ユーザーのセクションでは、操作する列の名前を(プロンプトを介して)指定できます。たとえば、input_col1が入力データセットの "order_datetime"という名前の列を参照するように指定し、input_col2の同様の指定を行うか、空白のままにします。ここで

は、私はカスタム変換のための出力を生成するために使用していたコードです:

data cust_trans; 
    set &_INPUT0; 

    i=1; 
    do while(i<3); 
     call symputx('index',i); 
     result = myfunc("&&input_col&index"); 
     output_col&index = result; /*what is proper syntax here?*/ 
     i = i+1; 
    end; 
run; 

ここmyfuncは、私が正常に動作のproc FCMPを使用して作られたカスタム関数を指します。私が上で動作するように考慮に入力列の可変数を取るしようとしていない場合

カスタム変換が正常に動作します(つまり私の代わりに"&&input_col&index""&&input_col&i"を使用して、ちょうど出力テーブルの列resultを使用している場合)。

しかし、私はよりダイナミックなアプローチをしようとして二つの問題を抱えている:

  • I入手含む行の次の警告 result = myfunc("&&input_col&index")

    警告:シンボリック見かけ参照INDEXは解決されません。

  • 希望する出力列への割り当てを動的に行う方法がわかりません。つまり、doループの反復に応じて、出力値を対応する出力列に割り当てたいと思います。

これに対する解決策は専門家の間ではよく知られているはずですが、私はこれを行う方法を説明するものは何も見つかりません。

すべてのヘルプは大歓迎です!

答えて

1

このように、データ変数に依存するマクロ変数を使用することはできません。マクロ変数は実行時ではなくコンパイル時に解決されます。

だからあなたはあなたが(それは実際のマクロの外に動作しません)マクロにいる、またはあなたは、配列を使用する必要がある場合は問題あり

%do i = 1 %to .. ; 

に持っているのどちらか。

data cust_trans; 
    set &_INPUT0; 
    array in[2] &input_col1 &input_col2; *or however you determine the input columns; 
    array output_col[2]; *automatically names the results; 
    do i = 1 to dim(in); 
     result = myfunc(in[i]); *You quote the input - I cannot see what your function is doing, but it is probably wrong to do so; 
     output_col[i] = result; /*what is proper syntax here?*/ 
    end; 
run; 

これは通常通りです。私はmyfuncが何であるか分からず、それを渡すときに"&&input_col&index."を引用する理由もわかりませんが、それは入力列の名前をテキストにしたい場合を除き、その変数にどのデータが含まれているかを知りたい)そうであれば、変数の名前を文字として渡すvname(in[i])を渡します。

+0

非常に迅速で徹底的な答えに感謝@ジョー。これは私の問題を修正しました。プロシージャに名前を渡すことについてのあなたの質問に関しては、これは部分的に質問のための最小限の実例を作ることの成果であり、部分的にはプロシージャが実際にテーブル名とカラム名を要求するという事実によるものです。重要じゃない。再び、非常に感謝! – Rookatu

関連する問題