데이터 세트에 date1-date99가 있고 관찰 당 누락 일 수가 5 개까지입니다. 나는 누락 날짜를 지키고 datenew-datenew5에 지정하려고합니다. 이 작업을 수행하는 가장 좋은 방법에 대한 제안. 나는 다른 루프 (i = 1에서 5, j = 1에서 99까지) 내에서 루프를 수행하고 생각했지만, 일단 누락 일이없는 첫 번째 날짜가 나오면 다음 값으로 이동하는 가장 좋은 방법을 기억하지 못했습니다. 발견되었습니다.SAS : 배열에서 누락 값을 유지합니다.
0
A
답변
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
가 새 배열에 특정 순서로 비없는 날짜가 필요하십니까? – user667489
예, 원본 데이터의 내용을 그대로 유지해야합니다. 예를 들어, 원본 : date1 = 1Jan1980, date2 =., date3 = 5Feb1980 및 새 데이터 집합에 datenew1 = 1Jan1980, datenew2 = 5Feb1980이 있어야합니다. 감사. –
원래 데이터 세트에서 날짜가 오름차순입니까? – user667489