2014-11-25 4 views
8

나는 거의 정렬 된 것으로 알고있는 SAS에 큰 데이터 세트가 있습니다. 첫 번째와 두 번째 수준은 정렬되어 있지만 세 번째 수준은 정렬되어 있지 않습니다. 또한 첫 번째와 두 번째 수준에는 많은 수의 고유 값이 포함되어 있으므로 처음 두 열을 이미 올바른 순서로 정렬 한 경우 다시 정렬하는 것이 바람직하지 않습니다. 데이터의 예는 다음과 같습니다 발동 정렬의 "사전 정렬"옵션을 사용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 

데이터가 모든 키에 정렬 된 경우에만 확인하는 것, 그렇지 않으면 데이터의 전체 종류의 작업을 수행합니다. 처음 두 개의 열이 이미 정렬되었음을 SAS에 알리는 방법이 있습니까?

+0

group 문을 사용하여 NOTSORTED 옵션을 살펴보십시오. 예를 들어 다음과 같습니다. http://support.sas.com/documentation/cdl/en/proc/61895/HTML/default/viewer.htm# a000146730.htm –

+0

병합을 위해 정렬해야합니까? –

+0

각 ID/레이블 쌍 내에서 가장 빈번한 빈도를 유지하도록 정렬하고 있습니다. – Nick

답변

8

데이터 세트의 첫 번째 2 개 변수로 이전에 데이터 세트를 정렬 한 경우 데이터 세트의 sortedby 정보에 관계없이 SAS는이를 정렬하기 위해 더 적은 CPU 시간을 사용합니다 *. 이것은 대부분의 알맞은 정렬 알고리즘의 자연스러운 속성입니다. 이미 거의 정렬 된 것을 정렬하는 것이 훨씬 적습니다.

* proc sort 문에서 force 옵션을 사용하지 않는 한 강제로 중복 정렬을 수행합니다.

여기에 내가 도망 약간의 테스트는 다음과 같습니다

  • SAS는 3 개 변수에 의해 원래 완전하게 정렬되지 않은 데이터 집합을 분류 8 초 걸렸 다음과 같이 내가 가진

    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; 
    

    관련 결과가 있었다.

  • SAS는 이미 2/3 변수로 정렬 된 기준선 데이터 세트에서 시작하여 3/3로 정렬하는 데 4 초가 걸렸습니다.
  • SAS는 정렬 정보를 제거한 후 동일한 기준선 데이터 세트에서 시작하여 3 초에 3 초씩 정렬하는 데 4 초가 걸렸습니다.

로그 출력의 관련 메트릭은 사용자 CPU 시간입니다.

물론 거의 정렬 된 데이터 세트가 매우 크고 다른 변수가 많이 포함 된 경우이를 대체 할 때 쓰기 오버 헤드로 인한 정렬을 피할 수 있습니다. 취할 수있는 또 다른 접근법은 복합 색인을 작성하는 것입니다. 이렇게하면 그룹 처리와 관련된 작업을 수행 할 수 있습니다. 인덱스를 생성

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

은 전체 데이터 세트의 읽기를 요구하는 종류의, 그러나 다시 그것을 서면으로 관련된 작업의 일부를 수행하고, 2/3 3/3보다 빠를 수도로 어떤 상황에서는 정렬.