Как удалить дубликаты записей \ наблюдений БЕЗ сортировки в SAS? - PullRequest
10 голосов
/ 18 апреля 2011

Интересно, есть ли способ удалить дубликаты записей? 1001 * БЕЗ сортировки? Иногда я хочу сохранить исходный порядок и просто хочу удалить дублирующиеся записи.

Возможно ли это?

Кстати, ниже приведены сведения о дублировании записей, которые в итоге сортируются.

1.

proc sql;
   create table yourdata_nodupe as
   select distinct *
   From abc;
quit;

2.

proc sort data=YOURDATA nodupkey;    
    by var1 var2 var3 var4 var5;    
run;

Ответы [ 8 ]

16 голосов
/ 18 апреля 2011

Вы можете использовать хеш-объект, чтобы отслеживать, какие значения были видны при прохождении набора данных.Выводится только тогда, когда вы сталкиваетесь с ключом, который еще не наблюдался.Это выводит в порядке, в котором данные наблюдались во входном наборе данных.

Вот пример использования входного набора данных "sashelp.cars".По данным Make исходные данные были в алфавитном порядке, поэтому вы можете видеть, что выходной набор данных "nodupes" поддерживает тот же порядок.

data nodupes (drop=rc);;
  length Make $13.;

  declare hash found_keys();
    found_keys.definekey('Make');
    found_keys.definedone();

  do while (not done);
    set sashelp.cars end=done;
    rc=found_keys.check();
    if rc^=0 then do;      
      rc=found_keys.add(); 
      output;              
    end;
  end;
  stop;
run;

proc print data=nodupes;run;
1 голос
/ 18 апреля 2011

Я думаю, что краткий ответ - нет, нет, по крайней мере, способа, который не имел бы гораздо большего снижения производительности, чем метод, основанный на сортировке.

Могут быть конкретные случаи, когдаэто возможно (набор данных, где все переменные индексируются? Относительно небольшой набор данных, который вы могли бы разумно загрузить в память и поработать там?), но это не поможет вам с общим методом.

Что-то похожееЛинии решения Криса Дж, вероятно, являются лучшим способом получить результат, к которому вы стремитесь, но это не ответ на ваш настоящий вопрос.

1 голос
/ 18 апреля 2011
/* Give each record in the original dataset and row number */
data with_id ;
  set mydata ;
  _id = _n_ ;
run ;

/* Remove dupes */
proc sort data=with_id nodupkey ;
  by var1 var2 var3 ;
run ;

/* Sort back into original order */
proc sort data=with_id ;
  by _id ;
run ;

0 голосов
/ 12 января 2018

Два примера, приведенные в исходном сообщении, не идентичны.

  • различаются в proc sql, удаляет только полностью идентичные строки
  • nodupkey в процедуре proc удаляет любую строку, где ключпеременные идентичны (даже если другие переменные не идентичны).Вам нужен параметр noduprecs, чтобы удалить полностью идентичные строки.

Если вы ищете только записи, имеющие общие ключевые переменные, другое решение, о котором я мог бы подумать, - это создать набор данных только с ключевой переменной (s) и выяснить, какие из них являются дубликатами, а затем применить формат к исходным данным, чтобы отметить дубликаты записей.Если в наборе данных присутствует более одной ключевой переменной, необходимо создать новую переменную, содержащую конкатенацию всех значений ключевой переменной, при необходимости преобразованную в символьную.

0 голосов
/ 09 апреля 2015

См. Примечание об использовании 37581: Как можно удалить дубликаты наблюдений из большого набора данных без сортировки , http://support.sas.com/kb/37/581.html.В примечании об использовании 37581 показано, как можно использовать PROC SUMMARY для более эффективного удаления дубликатов без использования сортировки.

0 голосов
/ 13 сентября 2014
data output;
set yourdata;
by var notsorted;
if first.var then output;
run;

Это не будет сортировать данные, но удалит дубликаты в каждой группе.

0 голосов
/ 08 мая 2013

Это самый быстрый способ, который я могу придумать. Не требует сортировки.

data output_data_name;
    set input_data_name (
        sortedby = person_id stay
        keep =
            person_id
            stay
            ... more variables ...);
    by person_id stay;
    if first.stay > 0 then output;
run;
0 голосов
/ 22 апреля 2011

В зависимости от количества переменных в вашем наборе данных может быть полезно следующее:

data abc_nodup;
   set abc;
   retain _var1 _var2 _var3 _var4;
   if _n_ eq 1 then output;
   else do;
      if (var1 eq _var1) and (var2 eq _var2) and
         (var3 eq _var3) and (var4 eq _var4)
         then delete;
      else output;
   end;
   _var1 = var1;
   _var2 = var2;
   _var3 = var3;
   _var4 = var4;
   drop _var:;
run;
...