2011-04-18 531 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