SAS PROC SQL 按所有变量分组以检测重复项

SAS PROC SQL Group by all variables to detect duplicates

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

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

但是,有 250 个变量,我不想输入 group by 1, 2, 3, ... , 250

以下 group by 语句不起作用:

group by *

group by _ALL_

group by 1:250

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

尝试为数据集的列名生成宏变量,然后分组在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;

如果所需的输出是 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;

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

检查重复项的示例代码return是一个数据集,其中包含键不唯一的所有记录。所以下面 returns 四个记录:

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 SORTNOUNIQUEKEY 选项.所以下面将 return 相同的四​​个记录:

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

并且BY语句可以是BY _ALL_,这将return所有变量上重复的两条记录:

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