我想尝试找到一种方法来对多个(多于两个)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;
但这不起作用,因为它删除了在同一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。如果该项仅包含一个值或不包含任何值,则删除其他项。
谢谢。
答案 0 :(得分:1)
由于您的情况取决于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;
答案 1 :(得分:0)
类似这样的东西。
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;