2014-11-25 22 views
8

Ho un set di dati di grandi dimensioni in SAS che so è quasi risolto; So che il primo e il secondo livello sono ordinati, ma il terzo livello no. Inoltre, il primo e il secondo livello contengono un gran numero di valori distinti e quindi è ancora meno desiderabile ordinare nuovamente le prime due colonne quando so che è già nell'ordine corretto. Un esempio dei dati è la seguente:Ordinamento di un set di dati quasi ordinato in 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 

Utilizzando l'opzione "preordinate" su un proc sorta sembra di verificare solo se i dati sono ordinati su ogni tasto, altrimenti si fa una sorta completa dei dati. C'è un modo per dire a SAS che le prime due colonne sono già ordinate?

+0

Dai un'occhiata all'opzione NOTSORTED per dichiarazione di gruppo, potrebbe essere d'aiuto, Esempio di esempio: http://support.sas.com/documentation/cdl/en/proc/61895/HTML/default/viewer.htm# a000146730.htm –

+0

Ne hai bisogno per l'unione? –

+0

Lo sto ordinando per mantenere la frequenza più comune all'interno di ogni coppia ID/Etichetta. – Nick

risposta

8

Se il set di dati è stato ordinato in precedenza dalle prime 2 variabili, quindi indipendentemente dalle informazioni sortedby sul set di dati, SAS impiegherà meno tempo della CPU per ordinarlo *. Questa è una proprietà naturale degli algoritmi di ordinamento più decenti - è molto meno lavoro per ordinare qualcosa che è già quasi ordinato.

* Finché non si utilizza l'opzione force nell'istruzione proc sort, che impone di eseguire l'ordinamento ridondante.

Ecco un piccolo test mi sono imbattuto:

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; 

I risultati rilevanti che ho ottenuto sono state le seguenti:

  • SAS ha preso 8 secondi per ordinare l'originale set di dati del tutto indifferenziati da tutte le 3 variabili.
  • SAS ha impiegato 4 secondi per ordinare per 3/3 a partire dal dataset della linea di base già ordinato per 2/3 variabili.
  • SAS ha impiegato 4 secondi per ordinare per 3/3 a partire dallo stesso set di dati di riferimento dopo aver rimosso le informazioni di ordinamento da esso.

La metrica rilevante dall'output del registro è la quantità di tempo CPU utente.

Ovviamente, se il set di dati quasi ordinato è molto grande e contiene molte altre variabili, è possibile che si desideri evitare l'ordinamento a causa dell'overhead di scrittura durante la sua sostituzione. Un altro approccio che potreste adottare sarebbe quello di creare un indice composito - questo vi permetterebbe di fare cose che coinvolgono l'elaborazione di gruppo, per esempio.

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

creazione di un indice richiede una lettura di tutto il set di dati, così come il tipo, ma solo una parte del lavoro svolto in forma scritta fuori di nuovo, e potrebbe essere più veloce di un 2/3 a 3/3 ordinare in alcune situazioni.

Problemi correlati