如何删除重复的记录\\\\观察而无需在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;
    
已邀请:
您可以使用哈希对象来跟踪通过数据集时看到的值。仅当遇到尚未观察到的键时才输出。这将按照在输入数据集中观察到数据的顺序输出。 这是使用输入数据集\“ 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;
    
/ *提供原始数据集中的每条记录和行号* / 数据with_id;   设置mydata;   _id = _n_; 跑 ; / *删除骗子* / proc sort data = with_id nodupkey;   由var1 var2 var3; 跑 ; / *按原始顺序排序* / proc sort data = with_id;   通过_id; 跑 ;     
我认为简短的答案是“否”,没有,至少没有一种方法不会比基于排序的方法具有更大的性能损失。 在某些特定情况下,这是可能的(对所有变量都建立索引的数据集?您可以合理地加载到内存中并在其中使用的相对较小的数据集?),但这对常规方法没有帮助。 克里斯·J(Chris J \)的解决方案可能是获得您所追求的结果的最佳方法,但这并不是您实际问题的答案。     
根据数据集中变量的数量,可能会很实际:
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;
    
请参考使用说明37581:如何在不进行排序的情况下从大型数据集中消除重复的观察结果,网址为http://support.sas.com/kb/37/581.html。使用说明37581显示了如何在不使用排序的情况下使用PROC Summary更有效地删除重复项。     
原始帖子中给出的两个示例并不相同。 在proc sql中与众不同仅删除完全相同的行 proc sort中的nodupkey删除键变量相同(即使其他变量不相同)的任何行。您需要选项noduprecs删除完全相同的行。 如果您只在寻找具有公共键变量的记录,那么我想到的另一种解决方案是创建一个仅包含键变量的数据集,找出哪个是重复的,然后在原始数据上应用格式以标记重复记录。如果数据集中存在多个关键字变量,则需要创建一个包含所有关键字变量值串联的新变量-必要时转换为字符。     
这是我能想到的最快方法。它不需要排序。
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;
    
data output;
set yourdata;
by var notsorted;
if first.var then output;
run;
这不会对数据进行排序,但是会删除每个组中的重复项。     

要回复问题请先登录注册