Удаление первого экземпляра столбца после group by в sas proc sql

#sas

Вопрос:

У меня есть следующий набор данных SAS.

взаимосвязь policynum рискнум
A X Y
A X Y
A X Y
B X Y
B X Y
B X Y
B X L
B X L
B X L
C Z M
C Z M
C Z M
D Z M
D Z M
D Z M

В SAS я хочу отфильтровать приведенный выше набор данных, чтобы получить окончательный результат в виде:

взаимосвязь policynum рискнум
B X Y
B X Y
B X Y
B X L
B X L
B X L
D Z M
D Z M
D Z M

т. е. для каждой группы policynum и risknum , если существует несколько значений correlation , я хочу сохранить второе значение и избавиться от первого значения.

Если correlation для группы » и «существует только одно значение policynum risknum «и», я тоже хочу сохранить эту группу в своем окончательном выводе.

Каков был бы лучший способ сделать это? Это может быть что-то простое, так как я относительно новичок в SAS.

Заранее спасибо!

Ответ №1:

Если порядок значений корреляции в порядке сортировки совпадает с порядком их отображения по строкам в наборе данных, вы можете использовать SQL. В противном случае SQL, основанный на теории множеств, который не имеет неявных номеров строк, не может быть использован. Можно использовать шаг ДАННЫХ с циклом DOW.

Пример:

К вашему сведению, одна из распространенных ситуаций, в которой кодеры SAS используют фразу «Цикл DOW», — это когда операторы SET amp; BY встречаются внутри цикла DO.

 data have;
input correlation $ policynum $ risknum $;
datalines;
A   X   Y
A   X   Y
A   X   Y
B   X   Y
B   X   Y
B   X   Y
B   X   L
B   X   L
B   X   L
C   Z   M
C   Z   M
C   Z   M
D   Z   M
D   Z   M
D   Z   M
;

/* keep last group of a nested group */

* SQL can be used only if correlation wanted is ALWAYS highest valued correlation;

    proc sql;
      create table want as
      select * from have
      group by policynum, risknum
      having correlation = max(correlation)
      ;

* DATA Step DOW loops can be used when correlation wanted is last occurring correlation within by group;

    data want;
      do _n_ = 1 by 1 until (last.policynum);
        set have;
        by policynum risknum notsorted; /* presume at least contiguous */
      end;
      _want_correlation = correlation;

      do _n_ = 1 to _n_;
        set have;
        if _want_correlation = correlation then OUTPUT;
      end;
    run;
 

Комментарии:

1. Спасибо, Ричард! Моя корреляция была такова, что значение, которое я хотел сохранить, было самой высокой корреляцией, поэтому ваше предложение proc sql сработало как заклинание.