BookmarkSubscribeRSS Feed
☑ This topic is solved. Need further help from the community? Please sign in and ask a new question.
rkepple
Calcite | Level 5

Hi all,

 

I am looking for a way to cumulatively count variable instances.  In the below dataset i want to count the first instance of each coupon 1

then the next time we see the same coupon then 2 and so forth.  For example: Jess 4000 should be 2, since Carl 4000  should be 1, and Amii 4000 4.  THANKS

 

data have;
input customer $ customer_id coupon coupon_value;
datalines;
carl 1 4000 9
carl 1 4001 7
carl 1 4002 4
carl 1 4003 3
jess 2 4000 9
jess 2 4004 7
jess 2 4002 5
jess 2 4001 3
lucy 3 4004 8
lucy 3 4000 6
lucy 3 4002 5
lucy 3 4008 2
amii 4 4004 8
amii 4 4000 7
amii 4 4001 4
amii 4 4002 3
;
run;

1 ACCEPTED SOLUTION

Accepted Solutions
Tom
Super User Tom
Super User

The more complicated way is to use a HASH object to store the counter for each coupon.

data want;
  if _n_=1 then do;
     declare hash h();
     h.definekey('coupon');
     h.definedata('count');
     h.definedone();
  end;
  set have;
  if h.find() then count=1;
  else count+1;
  h.replace();
run;

Result

                   customer_              coupon_
Obs    customer        id       coupon     value     count

  1      carl          1         4000        9         1
  2      carl          1         4001        7         1
  3      carl          1         4002        4         1
  4      carl          1         4003        3         1
  5      jess          2         4000        9         2
  6      jess          2         4004        7         1
  7      jess          2         4002        5         2
  8      jess          2         4001        3         2
  9      lucy          3         4004        8         2
 10      lucy          3         4000        6         3
 11      lucy          3         4002        5         3
 12      lucy          3         4008        2         1
 13      amii          4         4004        8         3
 14      amii          4         4000        7         4
 15      amii          4         4001        4         3
 16      amii          4         4002        3         4

View solution in original post

5 REPLIES 5
rkepple
Calcite | Level 5

AND I need to retain the order need it sorted / counted by customer ID (1 --> n)  THANKS

Tom
Super User Tom
Super User

The simple way to count like that it to order the data by the grouping variable and then just count them.

But you don't seem to have a variable to indicate the original order.

Perhaps you can just add one.

data for_analysis;
  set have;
  row+1;
run;
proc sort data=for_analysis;
  by coupon row;
run;
data want;
  set for_analysis;
  by coupon;
  count+1;
  if first.coupon then count=1;
run;
proc sort data=want;
  by row;
run;
Tom
Super User Tom
Super User

The more complicated way is to use a HASH object to store the counter for each coupon.

data want;
  if _n_=1 then do;
     declare hash h();
     h.definekey('coupon');
     h.definedata('count');
     h.definedone();
  end;
  set have;
  if h.find() then count=1;
  else count+1;
  h.replace();
run;

Result

                   customer_              coupon_
Obs    customer        id       coupon     value     count

  1      carl          1         4000        9         1
  2      carl          1         4001        7         1
  3      carl          1         4002        4         1
  4      carl          1         4003        3         1
  5      jess          2         4000        9         2
  6      jess          2         4004        7         1
  7      jess          2         4002        5         2
  8      jess          2         4001        3         2
  9      lucy          3         4004        8         2
 10      lucy          3         4000        6         3
 11      lucy          3         4002        5         3
 12      lucy          3         4008        2         1
 13      amii          4         4004        8         3
 14      amii          4         4000        7         4
 15      amii          4         4001        4         3
 16      amii          4         4002        3         4
ballardw
Super User

How many total Coupon identification numbers are there?

Retain a bunch of elements in an array to hold counts.

 

data want;
   set have;
   array c (4000:4008) _temporary_;
   c[coupon]+1;
   count=c[Coupon];
run;

This does require knowing the number of coupons, that the coupon variable is indeed numeric.

FreelanceReinh
Jade | Level 19

Hi @rkepple,

 

So you like hash object solutions? Here's another one, just for fun:

data want;
if _n_=1 then do;
  dcl hash h(suminc:'i');
  h.definekey('coupon');
  h.definedone();
end;
set have(in=i);
h.ref();
h.sum(sum:count);
run;

sas-innovate-wordmark-2025-midnight.png

Register Today!

Join us for SAS Innovate 2025, our biggest and most exciting global event of the year, in Orlando, FL, from May 6-9. Sign up by March 14 for just $795.


Register now!

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
  • 5 replies
  • 1020 views
  • 0 likes
  • 4 in conversation