2016-08-29 4 views
0

데이터 세트에 date1-date99가 있고 관찰 당 누락 일 수가 5 개까지입니다. 나는 누락 날짜를 지키고 datenew-datenew5에 지정하려고합니다. 이 작업을 수행하는 가장 좋은 방법에 대한 제안. 나는 다른 루프 (i = 1에서 5, j = 1에서 99까지) 내에서 루프를 수행하고 생각했지만, 일단 누락 일이없는 첫 번째 날짜가 나오면 다음 값으로 이동하는 가장 좋은 방법을 기억하지 못했습니다. 발견되었습니다.SAS : 배열에서 누락 값을 유지합니다.

+0

가 새 배열에 특정 순서로 비없는 날짜가 필요하십니까? – user667489

+0

예, 원본 데이터의 내용을 그대로 유지해야합니다. 예를 들어, 원본 : date1 = 1Jan1980, date2 =., date3 = 5Feb1980 및 새 데이터 집합에 datenew1 = 1Jan1980, datenew2 = 5Feb1980이 있어야합니다. 감사. –

+0

원래 데이터 세트에서 날짜가 오름차순입니까? – user667489

답변

0

나는이 그것을 않습니다 생각 :

data have; 
informat total_nonmissing; 
do j = 1 to 1000; /*Number of rows to output*/ 
    array date[99]; 
    chosen = 0; 
    remaining = dim(date); 
    do i = 1 to remaining; 
     call missing(date[i]); 
     if ranuni(2) < (5-chosen)/remaining then do; 
      date[i] = round(ranuni(1)*10000); 
      chosen + 1; 
      remaining + (-1);    
     end; 
    end; 
    total_nonmissing = n(of date{*}); 
    format date: yymmdd10.; 
    output; 
    drop i j chosen remaining; 
end; 
run; 

data want; 
    set have; 
    array newdate[5]; 
    array date[99]; 
    j = 1; 
    do i = 1 to dim(date); 
     if not(missing(date[i])) then do; 
      newdate[j] = date[i]; 
      j + 1; 
     end; 
    end; 
    format newdate: yymmdd10.; 
    keep newdate:; 
run; 
+0

고맙습니다, user667489. 이것은 완벽하게 작동했습니다! –

+0

SAS do 루프의 멋진 기능 중 하나는 복합 조건이 있다는 것입니다. 따라서 do 루프를 다음과 같이 변경하여 배열 인덱스 오류를 방지 할 수 있습니다. 'do i = 1 to dim (date) while (j <= dim (newdate)); '이렇게하면 NEWDATE 배열이 채워진 날짜를 찾지 못하게됩니다. – Tom