2014-09-06 4 views
1

해시 객체는 처음이지만 자세한 내용을 알고 싶습니다. 가능할 때마다 가능한 모든 proc sql과 regular merges를 hash로 대체하는 방법을 찾으려고합니다. SASHELP 데이터 세트로 놀면서 나는 다음과 같은 문제에 부딪쳤다.SAS 해시 객체 : 멀티 데이터 병합

나는 10 가지 고유 한 관측치 (자동차 제조업체)의 데이터 세트를 가지고 있는데,이 자동차의 다양한 모델을 포함하는 다른 테이블과 비교하기를 원한다고 가정 해보자. 그래서 차는 그 테이블에서 반복합니다. 주의해야 할 또 다른 중요한 점은 내가 찾는 테이블에 모든 자동차 제조사가있는 것은 아니지만 여전히 내 테이블에 보관하고 싶습니다. 테이블 X 테이블 자동차도 있었다 모든 다음 call missing(model) 정확히 내가 원하는 것을 할 것입니다 후 output 명령을 제거하게되면

proc sql noprint; 
    create table x as select distinct make 
    from sashelp.cars; 
quit; 

data x; 
    set x (obs = 10); 
    if make = "GMC" then make = "XYZ"; 
run; 


data hx (drop = rc); 

if 0 then set sashelp.cars(keep = make model); 
if _n_ = 1 then do; 
    declare hash hhh(dataset: 'sashelp.cars(keep = make model)', multidata:'y'); 
    hhh.DefineKey('make'); 
    hhh.DefineData('model'); 
    hhh.DefineDone(); 
end; 

set x; 
rc = hhh.find(); 
do while(rc = 0); 
    output; 
    rc = hhh.find_next(); 
end; 

if rc ne 0 then do; 
    call missing(model); 
    output; 
end; 

run; 

:

아래 코드를 살펴 보자. 그러나 나는 또한 "XYZ"를 테이블에 남겨두기를 원합니다. 당신이 볼 수 있듯이

make model 
========== 
Acura MDX 
Acura RSX Type S 2dr 
Acura TSX 4dr 
... (skipping a few rows) 
Acura NSX coupe 2dr manual S 
Acura 
Audi A4 1.8T 4dr 

은 위의 표에서, 마지막으로 두 번째에 누락 된 모델이있다 : 그것과 같이, 일치하는 모든 모델을 찾을 후

기존의 코드는, 그러나, 빈 생산 열. 이 패턴은 모든 make가 끝날 때 나타납니다.

이 문제를 해결하는 방법에 대한 제안은 매우 높이 평가 될 것입니다.

많은 감사합니다.

답변

2

직접 답변 :이 섹션을 고려해야합니다.

rc = hhh.find(); 
do while(rc = 0); 
    output; 
    rc = hhh.find_next(); 
end; 

if rc ne 0 then do; 
    call missing(model); 
    output; 
end; 

여기서 일어나는 일은 당신이 실패 할 때까지 반복적으로 다음, 찾기를 시도하는 것입니다. 괜찮아. 이제는 심지어 rc ne 0 상태에 있습니다. 비록 당신이 실제로 찾지 못했다면 마지막 단계 만 사용된다는 의미입니다.

몇 가지 방법으로 처리 할 수 ​​있습니다. 당신은 카운터 저장하는 위의 0은 아마 쉽게 경우 호출 실종/출력을 실행 한 후 루프 동안 할 수있는 카운터를 추가 할 수 있습니다,

rc = hhh.find(); 
if rc ne 0 then do; 
    call missing(model); 
    output; 
end; 
else 
do while(rc = 0); 
    output; 
    rc = hhh.find_next(); 
end; 

을 또는 : 당신은이 작업을 수행 할 수 있습니다.

또한 해시가이 문제의 올바른 해결 방법인지 여부도 고려해야합니다. 다중 데이터 해시로이를 해결할 수는 있지만 키 집합은 일반적으로 이와 같은 경우에 더 효율적이며 코드 작성이 훨씬 쉽습니다.

+0

감사합니다. Joe, 정말로 감사드립니다. 당신이 맞습니다, 해시가 여기에 올바른 해결책이 아닐 수도 있습니다. 해시를 사용하여 어떻게 그러한 연산을 대체 할 수 있는지 알기를 바랍니다. – IVR

+0

해시 오브젝트는 확실히 흥미롭고 때로는 더 나은 옵션입니다. SAS-L 메일 링리스트를받는다면 Paul Dorfman (원래 Hashers 중 한 명이었던)을 포함하여 다양한 일을하는 가장 좋은 방법에 대한 흥미로운 토론을 자주 볼 수 있습니다. – Joe