2014-11-25 16 views
8

Neredeyse dizildiğini bildiğim SAS'da büyük bir veri kümem var; Birinci ve ikinci seviyelerin sıralandığını biliyorum, ama üçüncü seviye değil. Ayrıca, birinci ve ikinci seviyeler çok sayıda farklı değer içerir ve bu yüzden zaten doğru sırada olduğunu bildiğimde ilk iki sütunu tekrar sıralamak daha az tercih edilir. verilerinin bir örneği aşağıda gösterilmiştir: a proc tür üzerinde "önceden ayrılmış" seçeneği kullanarakNeredeyse sıralanmış olan bir veri kümesini SAS'a ayırma

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

veri her tuş üzerinde sıralanır yalnızca kontrol etmek görünüyor, aksi takdirde verilerin tam tür yapar. SAS'a ilk iki sütunun zaten sıralanmış olduğunu söylemenin bir yolu var mı?

+0

Grup bildirimi tarafından NOTSORTED seçeneğine bir göz atın, yardımcı olabilir, Örnek: http://support.sas.com/documentation/cdl/en/proc/61895/HTML/default/viewer.htm# a000146730.htm –

+0

Birleştirme için ayrıştırmaya mı ihtiyacınız var? –

+0

Her bir Kimlik/Etiket çiftinde en yaygın sıklığı korumak için sıralıyorum. – Nick

cevap

8

Veri kümesini daha önce ilk 2 değişkene göre sıraladıysanız, daha sonra veri kümesindeki sortedby bilgisinden bağımsız olarak, SAS bunu çözmek için daha az CPU süresi alır *. Bu, en iyi sıralama algoritmalarının doğal bir özelliğidir - zaten neredeyse sıralanan bir şeyi sıralamak için çok daha az iş var.

* proc sort deyiminde force seçeneğini kullanmadığınız sürece, bunu gereksiz sıralamaya zorlar.

İşte koştum küçük bir test var:

  • SAS 3 değişkenlerin orijinal tamamen sıralanmamış veri kümesini sıralamak için 8 saniye sürdü şu şekildedir: bende

    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; 
    

    ilgili sonuçlar vardı.

  • SAS, 2/3 değişkenleri tarafından sıralanmış olan başlangıç ​​veri kümesinden başlayarak 3/3 sıralamak için 4 saniye sürdü.
  • SAS, sıralama bilgilerini kaldırdıktan sonra aynı temel veri kümesinden başlayarak 3/3 sıralamak için 4 saniye sürdü.

Günlük çıktısından ilgili metrik, kullanıcı CPU zamanının miktarıdır.

Şüphesiz, hemen hemen ayrılmış veri kümesi çok büyük ve çok sayıda başka değişken içeriyorsa, bunu değiştirirken yazma ek yükü nedeniyle sıralamadan kaçınmak isteyebilirsiniz. Yapabileceğiniz başka bir yaklaşım, birleşik bir dizin oluşturmak olabilir - bu, örneğin, grup işlemeye dahil olan şeyleri yapmanıza izin verir. bir dizin oluşturma

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

, bütün veri kümesinin bir okuma gerektirir tür, ama tekrar dışarı yazılı olarak katılan işin yalnızca bir kısmını yapar ve 2/3 3/3 kadar daha hızlı olabilir olarak bazı durumlarda sırala.

İlgili konular