SAS PROC SQL Group通过所有变量来检测重复项

时间:2018-05-11 16:44:21

标签: sas duplicates proc-sql

我有一个包含250个变量的数据集。我认为有些行可能是完全重复的。如果我只有3个变量,我可以运行此代码来检查dupes:

HEAD

但是,对于250个变量,我不想输入proc sql; create table checkDupe as select count(*) as N, * from bigTable group by 1, 2, 3 having N > 1; quit;

以下group by 1, 2, 3, ... , 250语句不起作用:

group by

是否有一种简洁的方法可以按所有变量进行分组?

3 个答案:

答案 0 :(得分:2)

尝试为数据集的列名生成宏变量,然后在sql中分组;

proc sql;
   select name into: name separate ',' from dictionary.columns where libname='SASHELP' and memname='CLASS';
quit;

proc sql;
   select count(*) as N,* from sashelp.class group by &name;
quit;

如果只是想知道数据集中是否有完整的重复项,请尝试以下方法:

proc sort data=sashelp.class out=want nodup;
by _all_;
run;

答案 1 :(得分:1)

检查重复项的示例代码将返回一个数据集,该数据集包含密钥不唯一的所有记录。所以下面返回四条记录:

data bigtable;
   input a b c d;
   datalines;
1 1 1 1
1 1 1 1
1 2 1 1
1 2 2 1
1 2 2 2
;
run;

proc sql;
  create table checkDupe1 as
  select *,count(*) as N
  from bigTable
  group by 1, 2, 3
  having N > 1;
quit;

假设您不需要N列,那么在SAS中获取所有非唯一行数据集的最简单方法是使用PROC SORT选项NOUNIQUEKEY 。所以下面将返回相同的四个记录:

proc sort data=bigtable out=checkDupe2 nouniquekey ;
  by a b c ;
run ;

BY语句可以是BY _ALL_,它将返回所有变量上重复的两条记录:

proc sort data=bigtable out=checkDupe3 nouniquekey ;
  by _all_ ;
run ;

答案 2 :(得分:0)

如果所需输出是SAS数据集中的每个唯一行,则不需要分组。在PROC SQL中执行此操作的最简单方法是使用distinct关键字。

例如:

data one;
   input a b c d;
   datalines;
   1 1 1 1
   1 1 1 1
   1 2 1 1
   1 2 3 4
   1 2 1 1
   ;
   run;
proc sql;
   select distinct * from one;
   run;

...产生以下输出,其中消除了两个重复的行。

enter image description here