2016-05-19 27 views
1

私のプログラムでは、SASの列からマクロにすべての変数を渡したいと思っています。私はこのようなコードを持っている:SASのマクロにPDV変数を渡す

data _null_; 
set T.BetterSet; 
%test(myCollumn); 
run; 

これは、単純なマクロです:

%macro test(variable); 

data &variable; 
set End.DatasetpreparedForAnalisys; 
where &variable <= 0; 
keep vin3 &variable; 
run; 

%mend; 

生憎、私はエラーを得た:ERROR:変数 "変数は、" ファイルEnd.DatasetpreparedForAnalisysではありません。

この問題を解決するにはどうすればよいですか?変数を渡すことが期待どおりに機能しないのはなぜですか?

+0

なぜ別のデータステップを実行しようとしていますか?また、「列からマクロにすべての変数を渡す」という意味を明確にすることはできますか?あなたが今までに試したことがどのように達成されたかは分かりません。 – superfluous

+0

変数値または変数名を渡そうとしていますか? – Reeza

+0

そうではありません。 call executeを使用します。 http://support.sas.com/documentation/cdl/ja/mcrolref/67912/HTML/default/viewer.htm#n1q1527d51eivsn1ob5hnz0yd1hx.htm – Reeza

答えて

1

別のデータステップ内にデータステップステートメントを発行しているので、コードはそのようには機能しません。そのようなことをするには、物事を別に設定する必要があります。それを行う方法は次のとおりです。

まず我々は値column1column2column5を挿入しますする列(あなたT.BetterSet表を装っ)と呼ばれるデータセットを生成しましょう - つまり、列は、我々は同じのテーブルに複製見たいです後で名前。

data columns; 
    informat column $32.; 
    input column; 
    datalines; 
column1 
column2 
column5 
; 

その後、我々は列column5からcolumn1を含む(あなたEnd.DatasetpreparedForAnalisys表を装っ)のサンプルデータを生成します。 columnsテーブルの内容が指定されている場合、列1,2および5のみが後でスタンドアロンテーブルになります。

data sampleData; 
    informat column1-column5 8.; 
    input column1-column5; 
    datalines; 
12 -1 2 3 0 
-2 -3 -1 0 -3 
0 -4 -5 -2 -9 
-1 -5 4 2 0 
; 

は、今、私たちは、個々の列の出力データセットを作成するために必要なすべての文を発行しますマクロ %createTable宣言する。

%macro createTable(col); 
    data &col; 
    set sampleData; 
    where &col <= 0; 
    keep &col; 
    run; 
%mend; 

これですべてがcall executeルーチンを使用するように設定されました。 call executeを使用すると、「並列」プロセスと呼ぶことができるものでステートメントを発行できます。つまり、現在のデータステップには含まれず、SASによってコンパイルされ実行されるステートメントのスタンドアロンのチャンクとして送信されます。 '%createTable'マクロ呼び出しは、一重引用符の中に置かれています。これは重要なことです。そうでなければ、問題にぶつかります。

data _null_; 
    set columns; 
    call execute(cats('%createTable(', column, ')')); 
run; 

ログが今示す:

NOTE: There were 3 observations read from the data set WORK.COLUMNS. 
NOTE: DATA statement used (Total process time): 
     real time   0.00 seconds 
     cpu time   0.00 seconds 

NOTE: CALL EXECUTE generated line. 
1 + data column1;  set sampleData;  where column1 <= 0;  keep column1; run; 

NOTE: There were 3 observations read from the data set WORK.SAMPLEDATA. 
     WHERE column1<=0; 
NOTE: The data set WORK.COLUMN1 has 3 observations and 1 variables. 
(...)  

2 + data column2;  set sampleData;  where column2 <= 0;  keep column2; run; 

NOTE: There were 4 observations read from the data set WORK.SAMPLEDATA. 
     WHERE column2<=0; 
NOTE: The data set WORK.COLUMN2 has 4 observations and 1 variables. 
(...) 

3 + data column5;  set sampleData;  where column5 <= 0;  keep column5; run; 

NOTE: There were 4 observations read from the data set WORK.SAMPLEDATA. 
     WHERE column5<=0; 
NOTE: The data set WORK.COLUMN5 has 4 observations and 1 variables. 
(...) 

はしたがって

  • 3の観察は
  • 4の観察は、フォームのCOLUMN2を維持したカラム1と呼ばれる新しいテーブル内のカラム1から維持されたことを確認します列2と呼ばれる新しい表
  • 列4からの4つの観察新しいテーブルcolumn5
関連する問題