SAS PROC SQL Group по всем переменным для обнаружения дубликатов - PullRequest
0 голосов
/ 11 мая 2018

У меня есть набор данных, который содержит 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

Существует ли краткий способ группировки по всем переменным?

Ответы [ 3 ]

0 голосов
/ 12 мая 2018

Если желаемым выходом является каждая уникальная строка из набора данных 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

0 голосов
/ 13 мая 2018

Ваш пример проверки кода на наличие дубликатов возвращает набор данных, содержащий все записи, в которых ключ НЕ является уникальным.Таким образом, ниже приведены четыре записи:

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 ;
0 голосов
/ 11 мая 2018

Попробуйте создать макропеременную для имен столбцов набора данных, затем сгруппируйте в 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;
...