Ваш код не будет работать, так как вы выдаете инструкции шага данных внутри другого шага данных. Чтобы делать такие вещи, вам нужно по-другому задавать вопросы. Вот как это сделать.
Сначала давайте генерировать набор данных под названием столбцов (создают в качестве 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
Почему вы пытаетесь запустить один шаг данных внутри другого? Кроме того, можете ли вы пояснить, что вы подразумеваете под «передать все переменные из столбца в макрос?» Я не понимаю, как то, что вы пробовали до сих пор, достигает этого. – superfluous
Вы пытаетесь передать значения переменных или имена переменных? – Reeza
Это не так. Используйте вызов execute. http://support.sas.com/documentation/cdl/en/mcrolref/67912/HTML/default/viewer.htm#n1q1527d51eivsn1ob5hnz0yd1hx.htm – Reeza