Шаг данных SAS Макс. По группам - PullRequest
0 голосов
/ 28 сентября 2018

У меня есть набор данных:

data data;
   input group $ count;
   datalines;
A 4
A 3
A 2
A 1
B 1
C 1
D 2
D 1
E 1
F 1
G 2
G 1
H 1
;
run;

Первая переменная является идентификатором группы, вторая подсчитывает количество наблюдений по группам, набор данных сортируется по группам, а затем по количеству в порядке убывания.

Я хочу новую переменную, которая принимает максимум переменной "count" для каждой группы, например:

data data;
   input group $ count max_count;
   datalines;
A 4 4
A 3 4
A 2 4
A 1 4
B 1 1
C 1 1
D 2 2
D 1 2
E 1 1
F 1 1
G 2 2
G 1 2
H 1 1
;
run;

Самое близкое, что мне удалось получить, это выполнить:

data data;
    set data;
    by group;
    if first.group then max_count=count;
run;

Но результат:

data data;
   input group $ count max_count;
   datalines;
A 4 4
A 3 .
A 2 .
A 1 .
B 1 1
C 1 1
D 2 2
D 1 .
E 1 1
F 1 1
G 2 2
G 1 .
H 1 1
;
run;

Есть идеи, как это сделать, пожалуйста?

Ответы [ 2 ]

0 голосов
/ 28 сентября 2018

Другим способом на шаге данных также можно использовать хеш-объект.

data want;
 if _n_ = 1 then do;
 dcl hash h(multidata:"Y", dataset:"data");
 h.definekey("group");
 h.definedone();
 end;
 set data ;
 by group;
  if  h.find() = 0 then do until(h.find_next() ne 0);
 max_count=sum(max_count,1);
  end;
 run;
0 голосов
/ 28 сентября 2018

Вы можете использовать последовательные циклы DOW для этого типа обработки.Цикл DOW - это цикл, в котором инструкция SET находится внутри цикла - схема, которой не учат во вводном шаговом программировании DATA.Первый цикл будет «измерять» группу для вычисления некоторой метрики уровня группы, а второй цикл будет применять метрику к каждому члену в группе при выводе строк.

data want;
  do _n_ = 1 by 1 until (last.group);
    set have;
    by group;
    if count > maxcount then maxcount = count;
  end;
  do _n_ = 1 to _n_;
    set have;
    output;
  end;
run;

Редактировать -Проще

Я не внимательно прочитал вопрос - он утверждает, что

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

data want;
  set data;
  by group descending count;
  if first.group then max_count = count;
  retain max_count;
run;

Пояснение

Принятие условия сортировки prima facie означает, что максимум уже известен для первой записи в группе.Таким образом, нет необходимости в цикле DOW для «измерения» группы.

Основные моменты:

  • descending count в операторе BY by обеспечивает предполагаемое условие
    • Если счетчик отсортирован не так, как ожидалось, в журнале возникнет ОШИБКА
  • first.group обнаружит первую строку в группе строк, гдезначение группы изменилось.Это точка, в которой счет будет максимальным при соблюдении условий BY.

    • переменная трекера max_count назначается только в этой точке
  • retain max_count - неисполняемый оператор.RETAIN указывает компилятору шага DATA на не сбрасывать на отсутствующие указанные переменные без набора данных (в верхней части неявного пошагового цикла DATA).Таким образом, max_count после назначения не изменяется для всех строк в группе.

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