Question: Dataset schoolx is given as :
data schoolx;
input Name $ Class $ Marks;
cards;
AAA X 20
AAA Y 30
AAA Z 40
AAA X 50
BBB X 60
BBB Y 70
BBB X 20
CCC X 10
CCC Y 40
CCC Z 50
CCC Z 30
;
run;
Generate the following output from the above dataset:
AAA X 70
AAA Y 30
AAA Z 40
BBB X 80
BBB Y 70
CCC X 10
CCC Y 40
CCC Z 80
Read the very good SAS documentation on by group processing, and you will find the answer yourself.
First do a proc sort by name and class.
Then, in a data step, use by name class; again.
use
if first.class then newmarks = 0;
to initialize at every group change, use
newmarks + marks;
to add the marks up (this syntax for summarization automatically makes newmarks a retained variable).
use
if last.class then output;
to write out the summarized observations
use
drop marks;
rename newmarks=marks;
to create the old structure.
can u please help me to explain with the output what exactly happens with this portion of code.I meant how first.class and last.class is working here.?
if first.class then newmarks = 0;
to initialize at every group change, use
newmarks + marks;
to add the marks up (this syntax for summarization automatically makes newmarks a retained variable).
use
if last.class then output;
to write out the summarized observations
use
drop marks;
rename newmarks=marks;
to create the old structure.
Read the very good SAS documentation on by group processing, and you will find the answer yourself.
Is there any specific reason for using first.id and last.id. You can use proc means instead.
proc sort data=schoolx;
by name class;
run;
PROC MEANS data=schoolx sum;
class name class;
var marks;
run;
proc sql;
select Name,Class,sum(Marks) as Marks from schoolx group by Name,Class;
quit;
data schoolx;
input Name $ Class $ Marks;
cards;
AAA X 20
AAA Y 30
AAA Z 40
AAA X 50
BBB X 60
BBB Y 70
BBB X 20
CCC X 10
CCC Y 40
CCC Z 50
CCC Z 30
;
run;
proc sort data = schoolx;
by Name Class;
run;
data want;
set schoolx;
by Name Class;
if first.class = 1 then do;
newmarks = 0;
newmarks = newmarks + marks;
end;
else newmarks = newmarks + marks;
if last.class then output;
retain newmarks;
run;
Registration is now open for SAS Innovate 2025 , our biggest and most exciting global event of the year! Join us in Orlando, FL, May 6-9.
Sign up by Dec. 31 to get the 2024 rate of just $495.
Register now!
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.
Ready to level-up your skills? Choose your own adventure.