SAS-按组查找多个观察值的数量并删除特定观察值

SAS-按组查找多个观察值的数量并删除特定观察值,sas,Sas,我想尝试找到一种方法,通过分组变量计算多个(两个以上)观察值的数量。在此之后,我希望删除有关计数少于两个的观察结果。下面是我正在尝试做的一个例子: 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 在这里,我想

我想尝试找到一种方法,通过分组变量计算多个(两个以上)观察值的数量。在此之后,我希望删除有关计数少于两个的观察结果。下面是我正在尝试做的一个例子:

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;
但这不起作用,因为它删除了相同VAR1中相同VAR3的观测值。我需要帮助建立更强大的东西

最后,我希望:

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是否包含VAR1和VAR2的每个组合的值1和2。如果条目仅包含一个值或不包含任何值,则删除Else

谢谢。

像这样的东西

  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;

由于您的情况取决于VAR1*VAR2组中的所有值,因此您可能希望使用双道循环。在第一个循环中,计算标志,在第二个循环中,使用这些标志来决定要写入哪些观察值

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;

谢谢你的回复。这是我尝试一些新想法的好办法。但我要寻找的是,对于VAR1和VAR2的每个组合,检查VAR3是否只包含1和2。否则,如果该条目仅包含其中一个值或不包含任何值,则删除该条目。无需检查first.var1(和last.var1),因为first.var1为1时,first.var2始终为1,last.var2为1。