BookmarkSubscribeRSS Feed
🔒 This topic is solved and locked. Need further help from the community? Please sign in and ask a new question.
ROHINISDAS
Obsidian | Level 7

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

1 ACCEPTED SOLUTION
7 REPLIES 7
Kurt_Bremser
Super User

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.

 

ROHINISDAS
Obsidian | Level 7

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.

SuryaKiran
Meteorite | Level 14

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;

Thanks,
Suryakiran
slchen
Lapis Lazuli | Level 10


proc sql;
select Name,Class,sum(Marks) as Marks from schoolx group by Name,Class;
quit;

PeterClemmensen
Tourmaline | Level 20
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;

SAS Innovate 2025: Save the Date

 SAS Innovate 2025 is scheduled for May 6-9 in Orlando, FL. Sign up to be first to learn about the agenda and registration!

Save the date!

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.

SAS Training: Just a Click Away

 Ready to level-up your skills? Choose your own adventure.

Browse our catalog!

Discussion stats
  • 7 replies
  • 1689 views
  • 4 likes
  • 5 in conversation