2016-05-19 3 views
1

В моей программе я хочу передать все переменные из столбца в макрос в SAS. У меня есть такой код:Передать переменные PDV в макрос в SAS

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

Это простой макрос:

%macro test(variable); 

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

%mend; 

Unfortunatelly Я получил сообщение об ошибке: Ошибка: переменная "переменная" не на End.DatasetpreparedForAnalisys файлов.

Как решить эту проблему? Почему передача переменных не работает должным образом?

+0

Почему вы пытаетесь запустить один шаг данных внутри другого? Кроме того, можете ли вы пояснить, что вы подразумеваете под «передать все переменные из столбца в макрос?» Я не понимаю, как то, что вы пробовали до сих пор, достигает этого. – superfluous

+0

Вы пытаетесь передать значения переменных или имена переменных? – Reeza

+0

Это не так. Используйте вызов execute. http://support.sas.com/documentation/cdl/en/mcrolref/67912/HTML/default/viewer.htm#n1q1527d51eivsn1ob5hnz0yd1hx.htm – Reeza

ответ

1

Ваш код не будет работать, так как вы выдаете инструкции шага данных внутри другого шага данных. Чтобы делать такие вещи, вам нужно по-другому задавать вопросы. Вот как это сделать.

Сначала давайте генерировать набор данных под названием столбцов (создают в качестве T.BetterSet таблицы), в которой мы будем вставлять значения column1, column2 и column5 - то есть, столбцы, мы хотели бы видеть воспроизведены в таблицах одного и те же имя позже.

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

Затем мы создадим выборочные данные (позируют в качестве End.DatasetpreparedForAnalisys таблицы), содержащей столбцы column1 через column5. Учитывая содержимое таблицы 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 наблюдения были сохранены от column1 в новой таблице под названием column1
  • 4 наблюдения были сохранены формы COLUMN2 в новая таблица под названием column2
  • 4 наблюдения были сохранены из столбца5 в новой таблице под названием column5