这可能很容易,但我发现在SAS中很难做到。
我想删除所有变量相同但只有一个的观察。我只想保留一个观察而不是两个。
实施例
DATA auto ;
INPUT make $ mpg $ rep78 $ weight $ foreign $;
CARDS ;
AMC 22 3 2930 0
AMC 22 3 2930 1
AMC 22 3 2930 0
AMC 22 3 2930 1
Audi 23 5 2830 1
Audi 23 3 2070 1
;
RUN ;
在AMC中,我们有3个条目,最后两个匹配,除了外部,其中0和1.现在我只想保留其中一个。
示例来自以下网站
通过更新的示例,我需要清理AMC,同时只保留一个 1和一个 0.目前它有4个条目。
答案 0 :(得分:1)
如果您只想让其中一个彼此相邻,我们可以merge
数据集与自身没有by
语句从第二个观察开始。可能还有其他方法(例如proc sql),而不是通过数据步骤中的暴力来实现。
data work.merged;
merge work.auto
work.auto(rename=(make=make2 mpg=mpg2 rep78=rep2 weight=weight2
foreign=foreign2) firstobs=2);
if make=make2 and mpg=mpg2 and rep78=rep2 and weight=weight2
and foreign NE foreign2 then delete;
if make=make2 and mpg=mpg2 and rep78=rep2 and weight NE weight2
and foreign=foreign2 then delete;
if make=make2 and mpg=mpg2 and rep78 NE rep2 and weight=weight2
and foreign=foreign2 then delete;
if make=make2 and mpg NE mpg2 and rep78=rep2 and weight=weight2
and foreign=foreign2 then delete;
if make NE make2 and mpg=mpg2 and rep78=rep2 and weight=weight2
and foreign=foreign2 then delete;
run;
proc print data=work.merged;
var make mpg rep78 weight foreign;
run;
最后,我们可以使用条件语句比较merged
变量,以确定除了一个变量之外哪些变量都相同。
proc print的输出没有var语句:
Obs make mpg rep78 weight foreign make2 mpg2 rep2 weight2 foreign2
1 AMC 22 3 2930 0 AMC 22 3 2930 0
2 AMC 22 3 2930 1 Audi 23 5 2830 1
3 Audi 23 5 2830 1 Audi 23 3 2070 1
4 Audi 23 3 2070 1
答案 1 :(得分:1)
我假设您的数据集已使用proc sort
进行排序,这样除了一个变量之外的所有变量相同的观察结果就像在您的示例中一样。
data work.merged;
merge work.auto
work.auto(rename=(make=make2 mpg=mpg2 rep78=rep2 weight=weight2
foreign=foreign2) firstobs=2);
x = 0;
if (make=make2) then x + 1;
if (mpg=mpg2) then x + 1;
if (rep78=rep2) then x + 1;
if (weight=weight2) then x + 1;
if (foreign=foreign2) then x + 1;
if x = 4 then delete;
run;
输出:
Obs make mpg rep78 weight foreign make2 mpg2 rep2 weight2 foreign2 x
1 AMC 22 3 2930 0 AMC 22 3 2930 0 5
2 AMC 22 3 2930 1 Audi 23 5 2830 1 1
3 Audi 23 5 2830 1 Audi 23 3 2070 1 3
4 Audi 23 3 2070 1 0
我们将比较merged
变量,如果它们相同,我们将x
增加1.在这种情况下,我们可以将变量x
从0增加到最大值每次都是5次。由于此数据集中有5个变量,因此x = 5是最大值,x = 0是最小值。如果除了一个之外它们都是相同的,那么x = 4.在x = 4的情况下,我们可以删除它。
答案 2 :(得分:0)
从您更新的示例中,我认为您想要的是数据集中的所有不同行。这可以使用数据步骤或proc sql:
来完成PROC SORT DATA=auto OUT=auto2 NODUPLICATES ;
BY _all_ ;
RUN ;
NODUPLICATES
删除所有重复的行,_all_
指定它以检查数据集中的所有字段。
proc sql noprint;
create table auto2 as
select distinct *
from auto
;
quit;
*
是一个通配符,用于指定数据集中的所有列,并且distinct会删除重复的行