BookmarkSubscribeRSS Feed
shlomiohana
Obsidian | Level 7

Hello,

 

I have this table:

 

Branch_IdRating
11
10
11
20
20
21
40
40
40
51
51
52

 

I want to go through the whole table and check that if a particular branch_id has more than one record with the number 0 in the Rating field it will replace it with 1 and will always leave a maximum of one record of the number 0 per branch.

 

No matter which records are replaced by the number 1 from all records with the number 0 in the same branch, the main thing is that one record remains with the number 0 in the ranking.


If the branch does not have a record with the number 0 as in branch 5 there is no need to make a change.


Example of the desired table after the change.

Final table:

Branch_IdRating
11
10
11
21
20
21
41
41
40
51
51
52

 

Thanks.

3 REPLIES 3
Reeza
Super User
data have;
input Branch_Id   Rating;
order = _n_;
cards;
1   1
1   0
1   1
2   0
2   0
2   1
4   0
4   0
4   0
5   1
5   1
5   2
;;;;

proc sort data=have;
by branch_ID rating;
run;

data want;
set have;
by branch_id rating;
original_rating = rating;
retain first_flag 0;

if first.branch_id then first_flag=0;

if first.rating and rating = 0 then first_flag = 1;
else if rating = 0 and first_flag = 1 then rating = 1;
run;

proc sort data=want;
by order;
run;

Using first logic is one way. There's probably a way to simplify this logic but this makes it pretty clear what's happening.

Astounding
PROC Star

Here's a one-step method that passes through each BRANCH data twice:

 

data want;
   changes_needed=-1;
   do until (last.branch_id);
      set have;
      by branch_id;
      if rating=0 then changes_needed + 1;
   end;
   do until (last.branch_id);
      set have;
      by branch_id;
      if rating=0 and changes_needed > 0 then do;
         rating=1;
         changes_needed = changes_needed - 1;
      end;
      output;
   end;
   drop changes_needed;
run;

The top DO loop counts how many zero values need to be changed for a BRANCH_ID.  Then the bottom DO loop rereads the same observations, makes the required changes, and outputs the observations.  

ChrisNZ
Tourmaline | Level 20

A quick logic:

data WANT;
  set HAVE;
  by BRANCH_ID;
  if first.BRANCH_ID then FOUND_ZERO=0;  
  if RATING=0 then FOUND_ZERO+1;
  if FOUND_ZERO>1 & RATING=0 then RATING=1;
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
  • 3 replies
  • 526 views
  • 1 like
  • 4 in conversation