Date: Thu, 1 Sep 2005 08:26:21 -0400
Reply-To: Jim Groeneveld <jim1stat@YAHOO.CO.UK>
Sender: "SAS(r) Discussion" <SAS-L@LISTSERV.UGA.EDU>
From: Jim Groeneveld <jim1stat@YAHOO.CO.UK>
Subject: Re: Missing data / data step question
Hi Muthia,
I think your first example still lacks reinitialization (resetting it
completely to missing) of the array at each FIRST.Unique or after each
LAST.Unique .
Here is another single data step approach, though with an additional SORT:
DATA Original;
INPUT Unique $ Year Ctr_num;
CARDS;
MO219 1998 1
MO510 1998 20
MO510 1997 13
MO510 1996 17
MO510 1995 16
MO510 1993 21
;
RUN;
PROC PRINT DATA=Original; RUN;
PROC SORT DATA=Original; BY Unique DESCENDING Year; RUN; * Redundant? ;
DATA Extended (DROP=NextYear ThisYear);
RETAIN NextYear;
SET Original; BY Unique;
ThisYear = Year;
IF (FIRST.Unique) THEN NextYear = 1998;
DO Year = ThisYear TO NextYear;
OUTPUT;
Ctr_num = .; * forget about it after ThisYear;
END;
IF (LAST.Unique) THEN DO Year = 1993 TO ThisYear-1; * or reverse ;
OUTPUT;
END;
NextYear = ThisYear - 1;
RUN;
PROC SORT DATA=Extended; BY Unique DESCENDING Year; RUN;
PROC PRINT DATA=Extended; RUN;
Regards - Jim.
--
Y. (Jim) Groeneveld, MSc., Biostatistician, Vitatron b.v., NL
Jim.Groeneveld_AT_Vitatron.com (replace _AT_ by AT sign)
http://www.vitatron.com, http://home.hccnet.nl/jim.groeneveld
My computer always teaches me something new I thought I knew already.
[common disclaimer]
On Wed, 31 Aug 2005 20:17:42 -0700, kachi <mkachi@YAHOO.COM> wrote:
>Peter,
>
>I posted a program earlier that uses the dataset HAVE and
>brings out the dataset WANTED as under:
>
>data wanted;
>array x(1993:1998) _temporary_;
>retain unique;
> set have;
> by unique;
>
> x(year) = Ctr_num;
> if last.unique then do;
> do i = 1998 to 1993 by -1;
> z = x(i);
> output;
> end;
> end;
> drop Year Ctr_num;
> rename i = Year z = Ctr_num;
>run;
>
>Ian observed that it can be solved in one data pass and I
>have been thinking on that and here is one approach.
>
>
>
>data have ;
>length old $8;
>retain old ' ';
>array x(1993:1998) _temporary_;
>
>infile datalines eof = eof;
>input unique $ year ctr_num ;
>
>if missing(old) then do;
> old = unique;
> x(year) = ctr_num;
>end;
>else if old = unique then
> x(year) = ctr_num;
>else do;
> link write;
> old = unique;
> x(year) = ctr_num;
>end;
>return;
>
>write:
> do i = 1998 to 1993 by -1;
> z = x(i);
> output ;
> end;
> do i = 1993 to 1998;
> x(i) = . ;
> end;
>return;
>eof:
> link write;
> stop;
>drop unique year ctr_num;
>rename old = unique i = year z = ctr_num;
>datalines ;
>MO219 1998 1
>MO510 1998 20
>MO510 1997 13
>MO510 1996 17
>MO510 1995 16
>MO510 1993 21
>;
>run;
>
>Regards,
>Muthia Kachirayan