подсчет количества наблюдений в группе

#sas

#sas

Вопрос:

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

 ID status 
101 Checked
101 Checked
101 NotChecked
101 Checked
101 NotChecked
  

Я хочу подсчитать количество базовых объектов obs в переменной состояния, например

 ID status        Count
101 Checked       2
101 Checked       2 
101 NotChecked    1
101 Checked       1
101 NotChecked    1
  

Я не хочу использовать proc sql, потому что, когда я говорю group by, тогда он сортирует набор данных и выдает результат, где, как здесь, переменная состояния не отсортирована.

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

1. Почему 3-я запись имеет значение 1, а не 2?

2. @Reeza идея состоит в том, чтобы подсчитать последовательные повторные записи с одинаковым статусом, третья запись помечается , а четвертая снова проверяется , поскольку она появляется только один раз, когда она считается единицей

Ответ №1:

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

Если у вас есть определенный порядок сортировки, который вы хотите сохранить, самый простой способ — создать ключевой столбец, содержащий желаемый порядок. Затем вы можете использовать его обратно так, как вам хотелось бы, после группировки.

 data have2;
    set have;
    varorder = _N_;
run;

proc sql;
    create table want as
        select id, status, count(*) as count
        from have2
        group by id, status
        order by varorder
    ;
quit;
  

Ответ №2:

Это работает для меня, немного более длительное решение, но в основном добавляет идентификаторы строк и групп для управления количеством. NOTSORTED Опция в инструкции BY помогает однозначно идентифицировать ваши группы.

 data have;
input ID status $12.;
cards;
101 Checked
101 Checked
101 NotChecked
101 Checked
101 NotChecked
;;;;
run;

data grouped;
set have;
by id status notsorted;
retain MyGroups count;
if first.id then count=1;
else count 1;
if first.status then MyGroups 1;
run;

proc sql;
create table want as
select *, count(*) as numberFound
from grouped
group by MyGroups
order by ID, count;
quit;