- data a;
- input sales;
- datalines;
- 3
- 4
- .
- .
- .
- 5
- 1
- .
- .
- .
- .
- .
- 8
- ; run;
- data b;
- set a;
- retain gp 0;
- n = _n_ ;
- sale_lag = lag(sales);
- if missing(sale_lag) ^= missing(sales) then gp+1;
- drop sale_lag;
- run;
- data want;
- retain last_nonMiss;
- count_missing = 0;
- do until(last.gp);
- set b;
- by gp;
-
- if ^missing(sales) then do;
- if last.gp then last_nonMiss = sales;
- output;
- end;
- if missing(sales) then do;
- count_missing + 1;
- end;
- end;
-
- if count_missing > 0 then do;
- do until(last.gp);
- nmiss = count_missing;
- last_sale = last_nonMiss;
- output;
- end;
- end;
- keep sales n nmiss last_sale;
- run;
- proc sort data=want out=want_sort;
- by descending n;
- run;
- data wanted; /* need to be sorted in reverse order */
- set want_sort;
- next_sale = lag(sales);
- if ^missing(sales) then output;
- if missing(sales) then do;
- if nmiss > 4 then do;
- do i = 1 to nmiss;
- sales = (last_sale+next_sale)/2;
- output;
- end;
- end;
- if nmiss <= 4 then do;
- do i = 1 to nmiss;
- sales = next_sale;
- output;
- end;
- end;
- end;
- keep sales;
- run;
- /* the results need to be sorted in reverse order */