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 (January 2009, week 4)Back to main SAS-L pageJoin or leave SAS-L (or change settings)ReplyPost a new messageSearchProportional fontNon-proportional font
Date:   Wed, 28 Jan 2009 18:45:42 -0600
Reply-To:   Joe Matise <snoopy369@GMAIL.COM>
Sender:   "SAS(r) Discussion" <SAS-L@LISTSERV.UGA.EDU>
From:   Joe Matise <snoopy369@GMAIL.COM>
Subject:   Re: Can one manipulate the value of first.whatever?
Comments:   To: Arthur Tabachneck <art297@netscape.net>
In-Reply-To:   <200901290006.n0SLqwFv016253@malibu.cc.uga.edu>
Content-Type:   text/plain; charset=ISO-8859-1

You certainly can't manipulate it the way you suggest directly, as that would be inconsistent with how a data step works.

The ways I could imagine doing something like that:

-- Use a counter: data have;

input id x;

cards;

1 1

1 1

1 3

1 4

2 1

2 2

2 3

3 2

3 3

3 4

;

run;

proc sort data=have;

by id;

run;

data have2;

set have;

by id;

if first.id then counter=0;

counter+1;

run;

data want;

set have2;

by id;

retain firstid;

if first.id then firstid=1;

if counter = firstid then do;

if x eq 1 then do;

firstid=firstid+1;

delete;

end;

end;

run; *yields 7 records, deleting the first two records in id=1 and the first record in id=2.

-- Use a retained tracker (same HAVE dataset):

data want;

set have;

by id;

retain nodelete;

if first.id then nodelete=0;

if nodelete=0 then do;

if x eq 1 then do;

delete;

end;

else nodelete=1;

end;

run;

-- DOW loop:

data want;

do y=1 by 1 until (last.id or x ne 1);

set have;

by id;

end;

drop y;

run;

though I'm not 100% sure why this works, I was expecting it to not work at all, but it at least works for the example (and also for the example where x=1 further down from first.id, it keeps that record). But it does seem to work.

-- Perhaps use LAG, though I can't come up with a functional example.

-Joe

On Wed, Jan 28, 2009 at 6:06 PM, Arthur Tabachneck <art297@netscape.net>wrote:

> Akshaya asked a question earlier today that made me think of a solution > that required a manipulative first.variable feature. However, I don't > know how one could accomplish that. For example, given the data file: > > data have; > input id x; > cards; > 1 1 > 1 2 > 1 3 > 1 4 > 2 1 > 2 2 > 2 3 > 3 2 > 3 3 > 3 4 > ; > > how can one, or can one, reset first.id if, because of a delete, it isn't > the first record anymore? For example: > > data want; > set test; > by id; > if first.id then do; > if x eq 1 then do; > delete; > /* reset first.id here*/; > end; > end; > first_id=first.id; > run; > > would (if the missing command were added) end up looking like: > > data desired_want; > input id x first_id; > cards; > 1 2 1 > 1 3 0 > 1 4 0 > 2 2 1 > 2 3 0 > 3 2 1 > 3 3 0 > 3 4 0 > ; > > Just wondering, > Art >


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