SAS는

2017-09-28 3 views
0

내가 데이터를 전치 (날짜) 따라 배열하고 싶은 값 대체 값 격차 예 : enter image description hereSAS는

/*COUNT ID BASED ON bucket and Sold_month*/ 
    PROC SQL; 
CREATE TABLE want AS 
SELECT bucket, Sold_month,COUNT(ID) as IID from TRANS_2 GROUP by bucket, 
Sold_month; 
quit; 

/*Format date*/ 
proc datasets ; 
modify want; 
FORMAT Sold_month YYMMN6.; 
quit; 

/*TRANSPOSE*/ 
PROC TRANSPOSE data=want out=wantf (drop=_:) prefix=D_ ; 
by bucket; 
var IID; 
id Sold_month; 
format IID best.; 
run; 

/*Sorting the dates Sold month*/ 
proc contents data=wantf out=col_names(keep=name) noprint; 
run; 

proc sort data=col_names out=col_names_sorted; 
by name; 
run; 
proc sql; 
create table col_names_sorted_n as 
select name from col_names_sorted where name<>'bucket'; 
run; 


data _null_; 
set col_names_sorted_n; 
by name; 
retain sorted_cols; 
length sorted_cols $2500.; 
if _n_ = 1 then sorted_cols =name ; 
else sorted_cols = catx(' ', sorted_cols, name); 
call symput('sorted_cols', sorted_cols); 
run; 

    %put &sorted_cols; 
    /* Final SOLD DATA- */ 
data output_sorted; 
retain bucket &sorted_cols; 
set wantf ; 
run; 

/*ADDING 0 to missing values*/ 
proc stdize data=output_sorted out=Transaction reponly missing=0; 
run; 

이 작동하지만 누락을 얻을 해달라고 버킷 (0-max) 및 sold_dt (최소 year-month에서 최대 year-month까지의 모든 year_month)의 최대 및 최소 값을 확인하여 얻으려는 열 이름 및 행 수동으로 모든 열/버킷을 입력하고 싶지는 않지만 최대 값과 최소값을 구합니다. 하지만 버킷은 0에서 최대까지 사용할 수 있습니다.

답변

1

COMPLETETYPES 옵션과 함께 PROC SUMMARY 만 사용하는 것이 가장 쉽습니다. 당신이 완전히 누락 BUCKET 값이있는 경우

proc summary data=TRANS_2 nway completetypes ; 
    class bucket sold_month ; 
    var id; 
    format sold_month yymmn6. ; 
    output out=tall n=iid; 
run; 

proc transpose data=tall out=want(drop=_name_) prefix=d_ ; 
    by bucket ; 
    id sold_month; 
    var iid ; 
run; 

, 예를 들어 당신이 버킷에 대한 어떤 기록이 없다 = 4 전혀, 당신은 몇 가지 레코드를 추가해야합니다. 요약 된 테이블에 추가하는 것이 더 쉬울 수도 있습니다.이 경우 요약표를 건너 뛰고 직접 수행 할 수 있습니다. 데이터를 요약하면 다음과 같습니다.

모든 버킷 번호 및 모든 월의 개수를 나타내는 테이블을 생성하십시오.

data tall_dummy ; 
    set tall_dummy ; 
    keep bucket sold_month iid; 
    iid=0; 
    do bucket = 0 to bucket ; 
    do i=0 to intck('month',min,max); 
     sold_month=intnx('month',min,i,'b') ; 
     output; 
    end; 
    end; 
    format sold_month yymmn6.; 
run; 

그런 다음 실제 버킷 * 월 조합으로 병합하고 0을 실제 개수로 대체하십시오.

data tall_full ; 
    merge tall_dummy tall ; 
    by bucket sold_month; 
run; 

다음으로 조 변경 할 수 있습니다.

proc transpose data=tall_full out=want(drop=_name_) prefix=d_ ; 
    by bucket ; 
    id sold_month; 
    var iid ; 
run; 
+0

나는 양동이를 얻을 수 있지만, 최대 (통)에 0을 생성하기 위해 하나의 데이터 단계를 사용하도록 업데이트 여러 년 – viji

+0

노트의 두 번째 부분을 사용하여 모든 누락 된 sold_months을하지 않았고, min (date) - max (date) 더미 데이터 집합. 횡단 연도가 문제가되어서는 안됩니다. 최소 날짜를 1 월로 반올림하려면 intnx()를 'year'간격으로 사용할 수 있습니다. – viji

+0

있다는 것을 코드 – Tom