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

Hello,

 

Consider the following program;

 

data have;
    input a;
    cards;
1
2
;
run;

proc sort data=sashelp.class out=class;
    by sex;
run;

data test;
    set have;

    do i=1 to nobs;
        set class nobs=nobs;
        by sex;
        if first.sex then total_weight=0;
        total_weight+weight;
        output;
    end;
run;

When execution reaches observation 2 of the have dataset, the whole sashelp.class has already been entirely read.

Thus the consecutive "set sashelp.class" will stop the data step.

I can not use the point= option because of by group processing.

 

Thanks for any advice to overcome this difficulty.

1 ACCEPTED SOLUTION

Accepted Solutions
Astounding
PROC Star

For the more complex problem, I confess to not reading it through sufficiently.  But it should still be possible to use POINT= to read every observation without a BY statement.  You would need to set up multiple buckets for the calculations (analogous to one set of calculations for F and one for M) when looping through with POINT=.

View solution in original post

7 REPLIES 7
data_null__
Jade | Level 19
What are you trying to do? Show data you want.
gamotte
Rhodochrosite | Level 12

Sorry for not being clear enough. Here is what the resulting dataset should look like :

 

a i Name Sex Age Height Weight total_weight
1 1 Alice F 13 56.5 84.0 84.0
1 2 Barbara F 13 65.3 98.0 182.0
1 3 Carol F 14 62.8 102.5 284.5
1 4 Jane F 12 59.8 84.5 369.0
1 5 Janet F 15 62.5 112.5 481.5
1 6 Joyce F 11 51.3 50.5 532.0
1 7 Judy F 14 64.3 90.0 622.0
1 8 Louise F 12 56.3 77.0 699.0
1 9 Mary F 15 66.5 112.0 811.0
1 10 Alfred M 14 69.0 112.5 112.5
1 11 Henry M 14 63.5 102.5 215.0
1 12 James M 12 57.3 83.0 298.0
1 13 Jeffrey M 13 62.5 84.0 382.0
1 14 John M 12 59.0 99.5 481.5
1 15 Philip M 16 72.0 150.0 631.5
1 16 Robert M 12 64.8 128.0 759.5
1 17 Ronald M 15 67.0 133.0 892.5
1 18 Thomas M 11 57.5 85.0 977.5
1 19 William M 15 66.5 112.0 1089.5
2 1 Alice F 13 56.5 84.0 84.0
2 2 Barbara F 13 65.3 98.0 182.0
2 3 Carol F 14 62.8 102.5 284.5
2 4 Jane F 12 59.8 84.5 369.0
2 5 Janet F 15 62.5 112.5 481.5
2 6 Joyce F 11 51.3 50.5 532.0
2 7 Judy F 14 64.3 90.0 622.0
2 8 Louise F 12 56.3 77.0 699.0
2 9 Mary F 15 66.5 112.0 811.0
2 10 Alfred M 14 69.0 112.5 112.5
2 11 Henry M 14 63.5 102.5 215.0
2 12 James M 12 57.3 83.0 298.0
2 13 Jeffrey M 13 62.5 84.0 382.0
2 14 John M 12 59.0 99.5 481.5
2 15 Philip M 16 72.0 150.0 631.5
2 16 Robert M 12 64.8 128.0 759.5
2 17 Ronald M 15 67.0 133.0 892.5
2 18 Thomas M 11 57.5 85.0 977.5
2 19 William M 15 66.5 112.0 1089.5
data_null__
Jade | Level 19
proc sort data=sashelp.class out=class;
   by sex;
   run;
data class;
   i = _n_;
   set class nobs=nobs;
   by sex;
   if first.sex then total_weight=0;
   total_weight+weight;
   run;
proc surveyselect noprint rep=2 rate=1 out=stacked(rename=(replicate=a));
   run;
gamotte
Rhodochrosite | Level 12

Thanks @data_null__ and @Astounding for your answers. I tried to simplify the problem in order to avoid distracting readers with unnecessary details  but i realize that it can give a misleading view of what i am trying to do.

 

The computation of sums only served as an example to justify a by statement. Actually, what is done in

the loop is dependant on the data in the currently processed row of the have dataset. That is,

for each row in have, i want to read the whole other dataset and create new variables that depend

on both datasets columns.

 

I just don't figure out how to restart reading the second dataset from observation 1 for each

new observation of the have dataset.

 

If you want the full context, i was trying to generalize my last answer in the following thread :

 

https://communities.sas.com/t5/SAS-Programming/Pairwise-comparisons-in-loops/m-p/497468#M131862

 

in order to take different sectors/quarters into account and stumbled upon this difficulty.

Astounding
PROC Star

It should be easy enough to summarize SASHELP.CLASS down to 2 observations (M and F) before bringing in HAVE.  Then you could use POINT=  (or possibly a sort and merge if that is a better choice).

Astounding
PROC Star

For the more complex problem, I confess to not reading it through sufficiently.  But it should still be possible to use POINT= to read every observation without a BY statement.  You would need to set up multiple buckets for the calculations (analogous to one set of calculations for F and one for M) when looping through with POINT=.

gamotte
Rhodochrosite | Level 12

Thanks, i finally managed to overcome the difficulty. I needed in particular first.var and last.var created by the by statement so i used a prior data step to save them as new columns of the dataset. The by statement thus became useless and i could use the POINT= option.

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
  • 1713 views
  • 0 likes
  • 3 in conversation