2014-11-25 20 views
8

Mam duży zbiór danych w SAS, który, jak wiem, jest prawie posortowany; Wiem, że pierwszy i drugi poziom są sortowane, ale trzeci poziom nie jest. Ponadto poziomy pierwszy i drugi zawierają dużą liczbę różnych wartości, a zatem jeszcze mniej pożądane jest ponowne sortowanie pierwszych dwóch kolumn, gdy wiem, że jest już we właściwej kolejności. Przykładem dane przedstawiono poniżej:Sortowanie prawie posortowanego zestawu danych w SAS

 
ID Label Frequency 
1 Jon  20 
1 John  5 
2 Mathieu 2 
2 Mathhew 7 
2 Matt  5 
3 Nat  1 
3 Natalie 4 

Korzystanie z „presorted” opcji na proc rodzaju wydaje się tylko sprawdzić, czy dane są klasyfikowane na każdym kluczu, inaczej robi pełną rodzaju danych. Czy jest jakiś sposób, aby powiedzieć SAS, że pierwsze dwie kolumny są już posortowane?

+0

Spójrz na opcję NOTSORTED w instrukcji grupy, może to pomóc, na przykład: http://support.sas.com/documentation/cdl/en/proc/61895/HTML/default/viewer.htm# a000146730.htm –

+0

Czy potrzebujesz go posortować do scalenia? –

+0

Sortuję to, aby zachować najbardziej powszechną częstotliwość w obrębie każdej pary ID/etykiety. – Nick

Odpowiedz

8

Jeśli wcześniej sortowałeś zestaw danych według pierwszych 2 zmiennych, to niezależnie od informacji o zestawie danych, sortedby, SAS będzie potrzebował mniej czasu procesora, aby go posortować *. Jest to naturalna właściwość najbardziej przyzwoitych algorytmów sortowania - znacznie mniej pracy polega na sortowaniu czegoś, co jest już prawie posortowane.

* Dopóki nie użyjesz opcji force w instrukcji proc sort, która zmusza ją do wykonania nadmiarowego sortowania.

Oto mały test Pobiegłem:

option fullstimer; 
/*Make sure we have plenty of rows with the same 1 + 2 values, so that sorting by 1 + 2 doesn't imply that the dataset is already sorted by 1 + 2 + 3*/ 
data test; 
    do _n_ = 1 to 10000000; 
     var1 = round(rand('uniform'),0.0001); 
     var2 = round(rand('uniform'),0.0001); 
     var3 = round(rand('uniform'),0.0001); 
     output; 
    end; 
run; 

/*Sort by all 3 vars at once*/ 
proc sort data = test out = sort_all; 
    by var1 var2 var3; 
run; 

/*Create a baseline dataset already sorted by 2/3 vars*/ 
/*N.B. proc sort adds sortedby information to the output dataset*/ 
proc sort data = test out = baseline; 
    by var1 var2; 
run; 

/*Sort baseline by all 3 vars*/ 
proc sort data = baseline out = sort_3a; 
    by var1 var2 var3; 
run; 

/*Remove sort information from baseline dataset (leaving the order of observations unchanged)*/ 
proc datasets lib = work nolist nodetails; 
    modify baseline (sortedby = _NULL_); 
    run; 
quit; 

/*Sort baseline dataset again*/ 
proc sort data = baseline out = sort_3b; 
    by var1 var2 var3; 
run; 

Odpowiednie wyniki dostałem były następujące:

  • SAS wzięło 8 sekund do sortowania oryginalny całkowicie niesegregowanych zestawu danych przez wszystkich 3 zmiennych.
  • SAS zajęło 4 sekundy, aby posortować wyniki o 3/3, począwszy od bazowego zestawu danych już posortowanego według zmiennych 2/3.
  • SAS zajęło 4 sekundy, aby posortować wyniki o 3/3, począwszy od tego samego bazowego zestawu danych po usunięciu z niego informacji o sortowaniu.

Odpowiednią metryką z wyjścia logu jest czas procesora użytkownika.

Oczywiście, jeśli prawie posortowany zbiór danych jest bardzo duży i zawiera wiele innych zmiennych, możesz chcieć uniknąć sortowania z powodu napowietrznego zapisu podczas jego wymiany. Innym rozwiązaniem, które można zastosować, byłoby stworzenie indeksu złożonego - na przykład umożliwiłoby to wykonanie zadań związanych z przetwarzaniem grupowym.

/*Alternative option - index the 2/3 sorted dataset on all 3 vars rather than sorting it*/ 
proc datasets lib = work nolist nodetails; 
    /*Replace the sort information*/ 
    modify baseline(sortedby = var1 var2); 
    run; 
    /*Create composite index*/ 
    modify baseline; 
    index create index1 = (var1 var2 var3); 
    run; 
quit; 

Tworzenie indeksu wymaga lektury całego zbioru danych, podobnie jak rodzaj, ale tylko część pracy zaangażowanych w pisanie go ponownie, a może być szybsze niż 2/3 do 3/3 sortować w niektórych sytuacjach.

Powiązane problemy