2013-08-07 6 views
1

여러 데이터 세트를 두 숫자 사이의 별도 그룹에 넣어 비교하려고합니다. 원래 나는 다음과 같은 진술을 가지고있었습니다.SAS : 두 숫자 사이의 값을 비교하여 별도의 버킷을 만들 수 있습니다.

if COLUMN1 gt 0 and COLUMN1 LE 1000 then PRICE_GROUP = 1000; 

나는 이것을 1000에서 100,000까지 올렸습니다. 유일한 문제는 각 price_group에 몇 개가 있는지를 계산하면 일부 price_groups가 누락되었습니다 (57,000 개는 값이 없기 때문에 일부 그룹에서는 표시되지 않습니다 (Price_group)). 내가 생각하는 솔루션은 각각에 대한 경계가있는 테이블을 만든 다음 실제 값과 상한값 및 하한값을 비교하는 것입니다.

proc iml; 

    mat = j(100,2,0); 

    total = 100000; 

    mat[1,1] = 0; 
    mat[1,2] = mat[1,1] + (total/100); 
    do i = 2 to nrow(mat); 
     mat[i,1] = mat[i-1,1] + (total/100); 
     mat[i,2] = mat[i,1] + (total/100); 
    end; 

create dataset from mat; 
append from mat; 
quit; 

이렇게하면 값을 비교할 수있는 표가 생성되지만, proc iml 외에는 더 쉬운 방법이 있습니까? 다음으로 각 값을 두 개의 열과 비교하고 테이블에 새 열을 만들어 각 버킷에 카운트 할 루프를 만들려고했습니다. 이것은 여전히 ​​비효율적 인 집중적 인 프로세스 인 것처럼 보입니다.

답변

1

IML은 끔찍한 해결책은 아니지만 정확히 무엇을하고 있는지에 따라 몇 가지 다른 방법이 있습니다.

가장 일반적인 것은 proc format입니다. 과 같이, 각 버킷을 관리하는 형식을 만듭니다

proc format; 
value buckets 
0-1000 = 1000 
1000<-2000 = 2000 
... 
other="NA"; 
quit; 

그런 다음 당신이 bucketed 값으로 새 변수를 만들 형식 (또는 정보 흐름)를 사용할 수 있습니다, 또는 더 나은, 즉시 형식을 사용 (즉, proc 수단 또는 겹침 점에서) 데이터 세트를 다시 작성할 필요가 없다는 것을 의미 할뿐만 아니라 원하는 버킷 수 (예 : buckets100 형식 또는 buckets20 및 기타)에 따라 형식을 전환 할 수 있습니다. 분명히 그 모든 예를 들어 작동하지 않지만

data want; 
set have; 
bucket = &total/100*(1+floor(column1/(&total/100))); 
run; 

: 그냥 수학을 사용하여 solveable처럼

둘째, 특정 질문 보인다.

세 번째로 형식을 사용할 수없는 경우 (예 : 양동이를 결정하는 요소가 두 개 이상인 경우) 해시 조회 테이블을 사용할 수 있습니다. 그게 유용하다면, SAS에서 검색 할 때 많이 사용되는 것처럼 확장 할 수 있습니다. 이것이 정규 데이터 스토어 내에서 IML 솔루션에 가장 가까운 솔루션입니다.

0

그룹과 다른 테이블 만들기 :

data group_table; 
do price_group=1000 to 100000 by 1000; 
output; 
end; 
run; 

그런 다음 키로 price_group 사용하여이 새 테이블로 그룹화/비교 테이블을 조인 왼쪽 :

proc sql; 
    create table price_group_compare as 
    select L.price_group,R.group1_count,R.group2_count 
    from group_table as L, group_counts as R 
    on L.price_group = R.price_group; 
quit; 
관련 문제