BookmarkSubscribeRSS Feed
☑ This topic is solved. Need further help from the community? Please sign in and ask a new question.
xyxu
Quartz | Level 8

I want to mark a row if it has the greatest non-missing value among the last N rows. Below is an example where N=3:

 

data have;
 	infile datalines delimiter = "," missover;
	input value;
	datalines;
	.
	.
	1.5
	.
	.
	.
	.
	1.1
	.
	2.0
	.
	.
	.
	2.2
	1.7
	.
	.
	.
run;
data want;
 	infile datalines delimiter = "," missover;
	input value mark count;
	datalines;
	., 0, .
	., 0, .
	1.5, 1, 1
	., 0, 2
	., 0, 3
	., 0, .
	., 0, .
	1.1, 1, 1
	., 0, 2
	2.0, 1, 1
	., 0, 2
	., 0, 3
	., 0, .
	2.2, 1, 1
	1.7, 0, 2
	., 0, 3
	, 0, .
	., 0,.
run;

I attempted to do this with retain command but didn't get what I want:

data get;
set have;
mark = 0;
retain value_old;
if value ne . and value > value_old then do;
mark = 1;
count = 1;
value_old = value;
end;
if lag(count) > 0 then count = lag(count) + 1;
if (value = . or value < value_old) and lag(count) = 3 then do;
count = .;
value_old = .;
end;
run;

 

1 ACCEPTED SOLUTION

Accepted Solutions
Adriaan_Gouws
Obsidian | Level 7

Good day

 

Half the answer was already provided by a previous user, I'm just adding the last bit.

data want_pick;
  set have;
  if value^=. and value>lag(value) and value>lag2(value) then pick=1;
  else pick=0;
run;

%let N = 3;

data want_count (rename=count_clean=count drop=count);
	set want_pick;
	retain count;

	if pick = 1 then
		count=1;
	else if lag(count)>0 then
		count+1;

	if count<=&N. then
		count_clean = count;
	else count_clean=.;
run;

View solution in original post

3 REPLIES 3
Tom
Super User Tom
Super User

I don't see how you get that output from your definition. I think you mean something different that what you said.

Here is what it sounds like you asked for:

data have;
	input value @@;
datalines;
. . 1.5 . . . . 1.1 . 2 . . . 2.2 1.7 . .
;

data max_over_last_3;
  set have;
  array last3 [0:2] _temporary_;
  last3[mod(_n_,3)] = value;
  max = max(of last3[*]);
  n = n(of last3[*]);
run;

Result:

Obs    value    max    n

  1      .       .     0
  2      .       .     0
  3     1.5     1.5    1
  4      .      1.5    1
  5      .      1.5    1
  6      .       .     0
  7      .       .     0
  8     1.1     1.1    1
  9      .      1.1    1
 10     2.0     2.0    2
 11      .      2.0    1
 12      .      2.0    1
 13      .       .     0
 14     2.2     2.2    1
 15     1.7     2.2    2
 16      .      2.2    2
 17      .      1.7    1
mkeintz
PROC Star

I see a logic to generate the PICK dummy, but the logic for COUNT escapes me:

 

data want;
  set have;
  if value^=. and value>lag(value) and value>lag2(value) then pick=1;
  else pick=0;
run;

 

--------------------------
The hash OUTPUT method will overwrite a SAS data set, but not append. That can be costly. Consider voting for Add a HASH object method which would append a hash object to an existing SAS data set

Would enabling PROC SORT to simultaneously output multiple datasets be useful? Then vote for
Allow PROC SORT to output multiple datasets

--------------------------
Adriaan_Gouws
Obsidian | Level 7

Good day

 

Half the answer was already provided by a previous user, I'm just adding the last bit.

data want_pick;
  set have;
  if value^=. and value>lag(value) and value>lag2(value) then pick=1;
  else pick=0;
run;

%let N = 3;

data want_count (rename=count_clean=count drop=count);
	set want_pick;
	retain count;

	if pick = 1 then
		count=1;
	else if lag(count)>0 then
		count+1;

	if count<=&N. then
		count_clean = count;
	else count_clean=.;
run;

SAS Innovate 2025: Call for Content

Are you ready for the spotlight? We're accepting content ideas for SAS Innovate 2025 to be held May 6-9 in Orlando, FL. The call is open until September 25. Read more here about why you should contribute and what is in it for you!

Submit your idea!

How to Concatenate Values

Learn how use the CAT functions in SAS to join values from multiple variables into a single value.

Find more tutorials on the SAS Users YouTube channel.

Click image to register for webinarClick image to register for webinar

Classroom Training Available!

Select SAS Training centers are offering in-person courses. View upcoming courses for:

View all other training opportunities.

Discussion stats
  • 3 replies
  • 719 views
  • 1 like
  • 4 in conversation