SAS - Найти количество наблюдений в нескольких группах BY и удалить конкретные наблюдения - PullRequest
1 голос
/ 21 марта 2019

Я хочу попытаться найти способ подсчета количества наблюдений в пределах нескольких (более двух) групповых переменных BY.После чего я хочу удалить наблюдения, относящиеся к тем, чье количество меньше двух.Вот пример того, что я пытаюсь сделать:

VAR1 VAR2 VAR3
 a     a    1
 a     a    2
 a     b    1
 a     b    2
 b     a    1
 b     a    2
 b     b    1
 b     b    2
 c     a    1
 c     b    1
 d     a    1

Здесь я хотел бы убедиться, что есть ровно два разных значения VAR3 относительно VAR1 и VAR2.

В этом примере вы можете видеть, что я хочу удалить последние три наблюдения, поскольку для каждой пары VAR1 / VAR2 существует одно значение.

Был ли простой способ сделать это?

Я пытался:

data want;
set have;
by VAR1 VAR2 VAR3;
if first.VAR3 = last.VAR3 then delete;
run;

Но это не сработало, поскольку он удалял наблюдения с той же VAR3 в той же VAR1.Мне нужно помочь построить что-то более надежное.

В конце я хочу это:

VAR1 VAR2 VAR3
 a     a    1
 a     a    2
 a     b    1
 a     b    2
 b     a    1
 b     a    2
 b     b    1
 b     b    2

Буду признателен за любую помощь.Спасибо.

РЕДАКТИРОВАТЬ:

Предоставление дополнительной ясности для того, что мне нужно.Я хотел бы проверить, содержит ли VAR3 оба значения 1 И 2 ​​для каждой комбинации присутствующих VAR1 и VAR2.Иначе удалите, если запись содержит только одно из значений или ни одного.

Спасибо.

Ответы [ 2 ]

1 голос
/ 21 марта 2019

Поскольку ваше состояние зависит от всех значений в группе VAR1 * VAR2, вы, вероятно, захотите использовать двойную петлю DOW.В первом цикле вычисляются флаги, а во втором - те, которые определяют, какие наблюдения записать.

data have;
  input VAR1 $ VAR2 $ VAR3 @@;
cards;
a a 1 a a 2 a b 1 a b 2 b a 1 b a 2 b b 1 b b 2 c a 1 c b 1 d a 1
;


data want;
  do until(last.var2);
    set have;
    by VAR1 VAR2 VAR3;
    if var3=1 then any1=1;
    else if var3=2 then any2=1;
    else anyother=1;
  end;
  do until(last.var2);
    set have;
    by VAR1 VAR2 VAR3;
    if any1 and any2 and not anyother then output;
  end;
  drop any1 any2 anyother;
run;
0 голосов
/ 21 марта 2019

как то так.

  data have;
input
VAR1 $ VAR2 $;
datalines;
a     a
a     a
a     b
a     b
b     a
b     a
b     b
b     b
c     a
c     b
d     a 
;

proc sort data=have ;
 by var1 var2;
run;

data want;
set have;
by var1 var2;
if first.var1 or first.var2 then var3=1;
else var3+1;
if (first.var1 and last.var1) or (first.var2 and last.var2) then delete;
run;

proc print;

enter image description here

...