LISTSERV at the University of Georgia
Menubar Imagemap
Home Browse Manage Request Manuals Register
Previous messageNext messagePrevious in topicNext in topicPrevious by same authorNext by same authorPrevious page (September 2005, week 1)Back to main SAS-L pageJoin or leave SAS-L (or change settings)ReplyPost a new messageSearchProportional fontNon-proportional font
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
Comments: To: mkachi@YAHOO.COM

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


Back to: Top of message | Previous page | Main SAS-L page