SAS: Возможно ли вернуться к предыдущему наблюдению в SAS Data Step? - PullRequest
2 голосов
/ 11 мая 2011

Я задавал этот вопрос и в RunSubmit, поскольку сообщество SAS Q & A кажется немного рассеянным. Если это не оценено, пожалуйста, дайте мне знать.

Возможно ли на шаге данных вернуться к предыдущему / определенному наблюдению и пройти дальше через набор данных?

Чтобы добавить к вопросу в случае, если он все еще не ясно, небольшой пример:

Набор данных 'work.test':

name  |   number   
John  |    1      
Jack  |    2  
Jane  |    3     
Jade  |    4       
Ronn  |    5       
Dick  |    6       
Sofy  |    7      
Sady  |    8      
Ruth  |    9      

Шаг данных:

Data _null_;
 set work.test;
 File ...\test.txt;
 put name;
 if number = 5 and counter=3 then do;
   counter = counter+1;
   *return to obs where number = 3* AKA *set obs pointer back to obs with nr=3*;
 end;
run;

* Вопрос о части возврат в obs, где число = 1 , а не о [и в первый раз] , который только добавляется, чтобы не создавался и бесконечный цикл. *

Дополнительная информация:
Поскольку кажется, что все еще не совсем ясно, что я хочу сделать, я добавил немного к исходному образцу набора данных и примеру. Просто помните, что он должен быть немного общим, а не фиксированным кодом Условия могут измениться позже. Но главный вопрос просто: « можно ли вернуться к obs = X и перейти оттуда, когда вы находитесь на obs = Y и как?»

Справочная информация: Это вписывается во всю историю создания вывода XML с использованием одной таблицы, содержащей поток XML, где некоторые элементы должны повторяться. Нет, использование карты XML невозможно из-за старой версии SAS. Нет, ОРВ также не применяется в этом случае. Кстати, это просто справочная информация, потому что замечание «Я до сих пор не знаю, что вы пытаетесь сделать» продолжает появляться;)

Список возможностей, НЕ применимых для моих нужд:

  • Функция REWIND (возвращает только к первому наблюдению)
  • Функция LAG (для получения предыдущего значения переменной, а не для возврата в obs)
  • Использование нескольких операторов SET: это не является универсальным способом, в котором я нуждаюсь (т.е. для некоторых наборов данных потребуется 2 цикла, для других потребуется 5 циклов, таким образом, 5 вложенных операторов SET ...)

Что МОЖЕТ работать:

  • Использование полного кода SCL для прохождения шага данных (отложено)
  • Параметр POINT в операторе SET (текущая попытка)
  • Хеш-таблицы: еще предстоит провести дополнительные исследования, так как я мало что знаю об этом или о том, как их реализовать.

Ответы [ 2 ]

1 голос
/ 13 мая 2011

Шаг данных SAS в основном работает с одним наблюдением за раз, поэтому я считаю, что комментарий sasfrog относительно объектов хеша может быть вашим лучшим выбором. Следующий код также может помочь (два оператора SET); но я до сих пор не уверен, каков ваш конечный ожидаемый результат, так что это просто грубый пример.

data test1;
   set test;
   if number eq 5 then do;
      set test(rename=(name=name2 number=counter) where=(counter=3));
   end;
run;
1 голос
/ 12 мая 2011

Оператор SET относится к исполняемому типу.

/* test data */
data one;
  input name $ num;
cards;
John 1 
Jack 2 
Jane 3 
Jade 4
;
run;

/* output obs until num=3 then output all */
data two;
   do until (num=3 or end1);
      set one end=end1;
      output;
   end;
   do until (end2);
      set one end=end2;
      output;
   end;
   stop;
run;

/* check */
proc print data=two;
run;
/* on lst
Obs    num    name

 1      1     John
 2      2     Jack
 3      3     Jane
 4      1     John
 5      2     Jack
 6      3     Jane
 7      4     Jade
*/
...