2011-04-18 493 views
10

我不知道是否有办法重复记录没有排序吗?有时,我想保持原始秩序,只是想删除重复的记录。如何删除重复记录观察没有排序在SAS?

可能吗?

顺便说一句,下面是我所知道的关于unduplicating记录,这不到底排序..

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; 
+0

什么是目前索引?我相信你可以很容易地以你想要的顺序检索数据库行,即使以不同的方式排序它们之后。 – bdares 2011-04-18 03:58:15

回答

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 ; 

1

我想简短的回答是否定的,没有,至少没有一种方法不会比基于排序的方法有更大的性能。

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

克里斯J的解决方案的一些东西可能是获得你的结果的最佳方式,但这不是你的实际问题的答案。

+2

是的,这是可能的 - cmjohns答案是正确的,并回答这个问题。它将按照OP所要求的完成,并且在分类时使用更少的开销。只要确保密钥是所有变量的串联,并且你很好走。 – 2011-04-18 16:02:54

+0

你是对的罗布,这是@克里斯J的回答,我指的是;当我发布我的答案时,@cmjohns'不错的解决方案不在那里。 – sasfrog 2011-04-18 22:12:19

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; 
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; 
0

这是我能想到的最快捷方式。它不需要分类。

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; 
-1
data output; 
set yourdata; 
by var notsorted; 
if first.var then output; 
run; 

这不会对数据进行排序,但将各组内删除重复。

0

请参考使用说明37581:如何在不分类的情况下从大型数据集中消除重复观测值,http://support.sas.com/kb/37/581.html。用法说明37581显示如何使用PROC SUMMARY可以更高效地删除重复项而不使用排序。

0

原始文章中给出的两个示例并不完全相同。

  • 在PROC SQL不同仅删除这是完全相同
  • nodupkey在PROC排序除去其中的关键变量是相同的(即使其它变量不相同)的任何行的行。您需要选项noduprecs才能删除完全相同的行。

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

+0

请不要“签署”您的帖子。您的个人资料会自动添加到帖子中,并且您可以在个人资料中链接到您的网站。 – ChrisF 2018-01-12 19:10:50