仅使用一个不同的变量删除观察

时间:2013-12-08 03:51:01

标签: sorting duplicates sas

这可能很容易,但我发现在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个条目。

http://www.ats.ucla.edu/stat/sas/modules/sort.htm

3 个答案:

答案 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会删除重复的行