Как удалить дублированные записи\наблюдения БЕЗ сортировки в SAS?

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

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

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

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;

Ответ 1

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

Вот пример использования набора входных данных "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;

Ответ 2

/* 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 ;

Ответ 3

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

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

Что-то по ряду решений Chris J, вероятно, лучший способ получить результат, за которым вы после, но это не ответ на ваш реальный вопрос.

Ответ 4

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

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;

Ответ 5

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

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;

Ответ 6

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

Ответ 7

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

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

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

Ответ 8

data output;
set yourdata;
by var notsorted;
if first.var then output;
run;

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