#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;