- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
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
Accepted Solutions
- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
Read the very good SAS documentation on by group processing, and you will find the answer yourself.
- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
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.
- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
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.
- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
Read the very good SAS documentation on by group processing, and you will find the answer yourself.
- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
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;
Suryakiran
- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
proc sql;
select Name,Class,sum(Marks) as Marks from schoolx group by Name,Class;
quit;
- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
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;