ДАННЫЕ SAS: как удалить наблюдения, которые происходят только один раз

В SAS предположим, что у меня есть набор данных с именем «person_groups». Он имеет две переменные с именами «человек» и «группа». Этот набор данных просто относит каждого человека к группе.

Как я могу удалить из этого набора данных всех людей, в группе которых больше никого нет? Другими словами, как я могу удалить все одноэлементные группы?

[Я был бы доволен решением proc sql или решением data step — подойдет любое из них.]

Примечание: я новичок в SAS. Я много лет использую C++ и MATLAB. Мне кажется, что я не понимаю, как что-нибудь сделать с шагом SAS DATA. Это кажется крайне неуклюжим, причудливым и неэлегантным. Честно говоря, я очень расстраиваюсь. У кого-нибудь есть надежда для утомленных? :)


person synaptik    schedule 04.11.2012    source источник


Ответы (2)


Вот способ, который использует шаг данных. Этот метод требует сортировки.

data person_groups;
 input person $ group $;
 datalines;
John Grp1
Mary Grp3
Joe Grp2
Jane Grp3
Frank Grp1
;

Proc Sort data=person_groups;
 by group;
run;

Data person_groups;
 set person_groups;
 by group;
 if first.group and last.group then delete;
run;
person Jay Corbett    schedule 04.11.2012
comment
Спасибо. Использование операторов by и операторов удаления в шагах данных кажется очень полезным. Зная их, я думаю, что могу сделать гораздо больше сейчас. - person synaptik; 04.11.2012

Вот PROC SQL решение:

proc sql;
   delete from person_groups
   where group in (
      select group
      from person_groups
      group by 1
      having count(*) = 1
      );
quit;

Как видите, PROC SQL в основном следует стандартному синтаксису ANSI, поэтому ваши существующие навыки работы с SQL должны быть достаточно переносимыми. И держитесь там в отношении программирования SAS Data Step; язык чрезвычайно богат, полнофункционален и ни в коем случае не «неэлегантен». Вы могли видеть некрасивый код, но это скорее вина программиста. Уделите несколько минут и прочтите Руководство по концепциям SAS.

person BellevueBob    schedule 04.11.2012
comment
Большое спасибо. Возможно, мне следует попытаться полагаться на proc sql больше, чем на шаг данных SAS, по крайней мере, пока я не узнаю больше о программировании шагов данных. Может ли proc sql делать очень большой процент того, что может сделать шаг данных? Спасибо, я обязательно прочитаю этот мануал. - person synaptik; 04.11.2012
comment
Одним из удобных аспектов шага данных является то, что когда вы выполняете MERGE и идентифицируете свои наборы данных с помощью опции IN=, вы можете определить статус слияния каждой записи. Вы получаете это с одним проходом на шаге данных, но я полагаю, что для PROC SQL потребуется несколько проходов. Хотя каждый набор данных должен быть отсортирован до этапа данных, поэтому он может оказаться эффективным с точки зрения эффективности промывки. - person Jay Corbett; 05.11.2012
comment
Я определенно рекомендую изучить методы шага данных, если вы собираетесь использовать SAS. Я предполагаю, что большинство вещей можно сделать в любом из них, но определенно есть вещи, которые вы бы предпочли сделать на этапе данных - предположительно, как этот; Я ожидаю, что решение шага данных будет быстрее. - person Joe; 05.11.2012