SAS с использованием итерационной переменной с циклом do - PullRequest
1 голос
/ 22 октября 2019

У меня есть примерный набор данных, и я пытаюсь создать новый набор данных из каждого наблюдения (записи) с помощью цикла do.

вот пример кода:

data tst;
input a b;
datalines;
1 2
2 3
;
run;

data ds1 ds2;
set tst 
/*point = point nobs = Nobs*/
;
do i=1 to 2;
    call symput("i",i);
    %put &=i;
    if _n_ then output ds&i.;
end;
run;

Я запутался, почему &i. не разрешается правильно. Похоже, что в журнале есть много места, предшествующего этому. Я попытался использовать функцию сжатия на ds&i., и это не работает. Я знаю, что мог бы использовать макрос и делать это без вызова symput (), но мне интересно, в чем проблема с этим?

Идеальный вывод:

DS1:
a b 1 2

DS2:
a b 2 3

Ответы [ 2 ]

0 голосов
/ 23 октября 2019

Это происходит потому, что макрос переменная не может быть использована на шаге данных, где она была инициализирована. Поэтому я думаю, что вы должны использовать макрос (и исправить оператор if в образце, выполненном так, как я думаю):

data tst;
input a b;
datalines;
1 2
2 3
;
run;

%macro output(); %macro d;%mend d;
   data ds1 ds2;
   set tst 
   /*point = point nobs = Nobs*/
   ;
   %do i=1 %to 2;
       if mod(_n_,&i)=0 then output ds&i.;
       /*if _n_=&i then output ds&i.;*/
   %end;
   run;
%mend output;

%output();

tst:

+---+---+
| a | b |
+---+---+
| 1 | 2 |
| 2 | 3 |
+---+---+

ds1:

+---+---+
| a | b |
+---+---+
| 1 | 2 |
+---+---+

ds2:

+---+---+
| a | b |
+---+---+
| 2 | 3 |
+---+---+
0 голосов
/ 22 октября 2019

Это известное поведение. Выдержка из руководства по поддержке вызовов:

Проблема при попытке сослаться на присвоенное SYMPUT значение до того, как оно станет доступным

Одна из самых распространенных проблем в использовании SYMPUT - попытка сослаться на назначенное значение макропеременнойпо SYMPUT до создания этой переменной. Обычно ошибка возникает из-за того, что оператор, ссылающийся на макропеременную, компилируется перед выполнением оператора CALL SYMPUT, который присваивает значение переменной. Наиболее важный факт, который следует помнить при использовании SYMPUT, - это то, что он присваивает значение макропеременной во время выполнения программы. Ссылки на макропеременные разрешаются во время компиляции шага, глобального оператора, используемого вне шага, или программы SCL. В результате:

Нельзя использовать ссылку на макропеременную для получения значения макропеременной в той же программе (или шаге), в котором SYMPUT создает эту макропеременную и присваивает ей значение.

Необходимо указать оператор границы шага, чтобы принудительно выполнить шаг DATA, прежде чем ссылаться на значение в глобальном операторе, следующем за программой (например, оператор TITLE). Граница может быть оператором RUN или другим оператором DATA или PROC.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...