- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
data have;
input Name $ Age;
cards;
Jack 10
Joe 31
Tom 22
Roe 33
Rex 44
Tim 24
;
How to find the maximum value of AGE variable through data steps without using loop, min and max function.
Accepted Solutions
- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
This is a commonly asked question when learning to program so it's within the realm of 'semi-decent' questions. It teaches you how information is carried across rows, conditional logic and how to identify the end of a file. There are automated ways, but often these basics are ignored. I suspect this is the answer your professor is looking for, since it's the most basic solution I can think of, besides the PROC SORT method.
Using the test data from @novinosrin, the approach outlined below works well. It matches his answer with the IFN so that's another viable option as well.
- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
You want to have "FUN" here? Hmm, I would like to learn from you. Do you know how to do it? If yes, please share. Thank you!
- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
Actually, you interpret it wrong. Not using the inbuilt function max, min and loop.
- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
Why?
data have;
input Name $ Age;
cards;
Jack 10
Joe 31
Tom 22
Roe 33
Rex 44
Tim 24
;
proc sort;
by descending age;
run;
data maxage;
set have (obs= 1);
drop name;
run;
The SAS System |
Age |
44 |
- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
Same "instructor" as referenced in this post perhaps? https://communities.sas.com/t5/Base-SAS-Programming/beginner-needs-help-with-min-max-function/m-p/42...
- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
Why avoid built-in procedures to do this? It makes no sense. It makes your life more difficult. A pointless restriction.
Unless it's a homework assignment, in which case you need to try it yourself, and ask questions when you get stuck. But it still makes no sense to do it this way.
Paige Miller
- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
Does > and < logic count as max/min functions? Technically they're operators. And technically, the min/max function in a data step will not give you the min/max of a column without other logic.
@ajay_mishra wrote:
data have;
input Name $ Age;
cards;
Jack 10
Joe 31
Tom 22
Roe 33
Rex 44
Tim 24
;
How to find the maximum value of AGE variable through data steps without using loop, min and max function.
- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
No. It will act as an operator.
- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
data test;
input Name $ Age;
cards;
Jack 10
Joe 31
Tom 22
Roe 33
Rex 44
Tim 24
;
proc transpose data=test out=w;
var age;
run;
data wantt;
set w;
array c(*) col:;
call sortn(of c: );
keep col6;
run;
data wantt2;
set test end=last;
array a(100) _temporary_;
retain a;
a(_n_)=age;
if last then do; call sortn(of a(*));max=a(dim(a));output;end;
keep max;
run;
- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
One more:
data wantt3;
set test end=last;
retain max;
max=ifn(Age>max,age, max);
if last;
keep max;
run;
- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
I doubt if your class has gotten to hash objects, so here's a solution I'm sure is not contemplated by your instructor, but which satisfies the criteria. I don't recommend submitting it:
data have;
input Name $ Age;
cards;
Jack 10
Joe 31
Tom 22
Roe 33
Rex 44
Tim 24
run;
data want;
if 0 then set have;
declare hash h (dataset:"have",ordered:'D');
h.definekey('age');
h.definedata(all:'Y');
h.definedone();
declare hiter ih ('h');
ih.first();
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
--------------------------
- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
This is a commonly asked question when learning to program so it's within the realm of 'semi-decent' questions. It teaches you how information is carried across rows, conditional logic and how to identify the end of a file. There are automated ways, but often these basics are ignored. I suspect this is the answer your professor is looking for, since it's the most basic solution I can think of, besides the PROC SORT method.
Using the test data from @novinosrin, the approach outlined below works well. It matches his answer with the IFN so that's another viable option as well.