如何删除没有在SAS中排序的重复记录\观察?

时间:2011-04-18 03:42:47

标签: sorting sas duplicates

我想知道是否有办法将记录没有排序?#有时候,我想保留原始订单,只想删除重复的记录。

有可能吗?

顺便说一句,以下是我所知道的关于不重复记录的内容,它最终会进行排序..

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 个答案:

答案 0 :(得分:16)

您可以使用哈希对象来跟踪在通过数据集时看到的值。仅在遇到尚未观察到的密钥时输出。这将按输入数据集中的数据顺序输出。

以下是使用输入数据集“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 :(得分:1)

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

答案 2 :(得分:1)

我认为简短的答案是否定的,没有,至少没有一种方法比基于排序的方法没有更大的性能影响。

可能存在可能的特定情况(所有变量都被编入索引的数据集?一个相对较小的数据集,您可以合理地加载到内存中并在那里工作?)但这对一般方法没有帮助。

Chris J的解决方案可能是获得你所得到的结果的最好方法,但这不是你实际问题的答案。

答案 3 :(得分:0)

根据数据集中的变量数量,以下内容可能是实用的:

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;

答案 4 :(得分:0)

请参阅使用说明37581:如何在不进行排序的情况下消除大型数据集中的重复观察http://support.sas.com/kb/37/581.html。使用说明37581显示了PROC SUMMARY如何在不使用排序的情况下更有效地删除重复项。

答案 5 :(得分:0)

原帖中给出的两个例子并不相同。

    proc中的
  • distinct仅删除完全相同的行
  • proc中的
  • nodupkey删除任何关键变量相同的行(即使其他变量不相同)。您需要选项noduprecs来删除完全相同的行。

如果你只是在寻找具有共同密钥变量的记录,我能想到的另一个解决方案是创建一个只包含密钥变量的数据集,找出哪个是重复的,然后在原始文件上应用格式标记重复记录的数据。如果数据集中存在多个关键变量,则需要创建一个包含所有关键变量值的串联的新变量 - 如果需要,将转换为字符。

答案 6 :(得分:-1)

这是我能想到的最快的方式。它不需要排序。

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;

答案 7 :(得分:-1)

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

这不会对数据进行排序,但会删除每个组中的重复项。