Let's say a company will give some coupons to their member,
the member ID is shown as follows.
there are 10 levels of membership,
For ID starting with A,B,C, the index is 1
E,F,G, the index is 2.
The numbers of coupon the member can get = 2 X index
.....
.....
A123
A124
B135
C134
D134
...
Letter Index
A,B,C 1
D,E,F 2
G,H,I 3
J,K 4
L,M,N 5
O,P,Q 6
R,S,T 7
U,V 8
W,X 9
Y,Z 10
How can i use SAS array to do above question?
Array index[ ]
Thank you so much.
I think a simple format for index will work in your case.
I would agree with @ndp. Using the format procedure will do what I believe you are looking for. Here's some test code for you:
data have;
input MemberID$;
datalines;
A123
B135
C134
D134
E134
F134
G134
H134
I134
J134
K134
L134
M134
N134
O134
P134
Q134
R134
S134
T134
U134
V134
W134
X134
Y134
Z134
;
run;
proc format;
value $ Ind 'A'=1 'B'=1 'C'=1
'D'=2 'E'=2 'F'=2
'G'=3 'H'=3 'I'=3
'J'=4 'K'=4
'L'=5 'M'=5 'N'=5
'O'=6 'P'=6 'Q'=6
'R'=7 'S'=7 'T'=7
'U'=8 'V'=8
'W'=9 'X'=9
'Y'=10 'Z'=10;
run;
data want;
set have;
Letter=substr(MemberID,1,1);
Index=put(Letter,Ind.);
Num_Coupon=put(Index,3.)*2;
run;
It's not clear that arrays are the best tool for the job, but it can be done:
array letters {29} $ 1 _temporary_ ('A' 'B' 'C' 'D' 'E' 'F' 'G' 'H' 'I' 'J' 'K' ' ' 'L' 'M' 'N' 'O' 'P' 'Q' 'R' 'S' 'T' 'U' 'V' ' ' 'W' 'X' ' ' 'Y' 'Z');
index = int( (whichc(substr(id,1,1), of letters{*}) + 2) / 3);
It's untested, so it may need a tiny bit of tweaking.
Here is a solution but it doesn't use array:
proc format;
invalue level
'A'-'C' = 1
'D'-'F' = 2
'G'-'I' = 3
'J'-'K' = 4
'L'-'N' = 5
'O'-'Q' = 6
'R'-'T' = 7
'U'-'V' = 8
'W'-'X' = 9
'Y'-'Z' = 10
;
data have;
input Mem_Num$;
level = substr(mem_num,1,1);
cards;
A123
A124
B135
C134
D134
;
data want;
set have;
display_level = input(level,level.);
coupon = input(level,level.) * 2;
run;
Below is a relatively straightforward solution:
DATA have;
LENGTH member_id $8;
INPUT member_id $;
DATALINES;
A123
A124
B135
C134
D134
E333
®888
¥999
;
RUN;
DATA want;
SET have;
letter = SUBSTR(member_id, 1, 1);
SELECT;
WHEN (letter IN ('A','B','C')) index = 1;
WHEN (letter IN ('D','E','F')) index = 2;
WHEN (letter IN ('G','H','I')) index = 3;
WHEN (letter IN ('J','K')) index = 4;
WHEN (letter IN ('L','M','N')) index = 5;
WHEN (letter IN ('O','P','Q')) index = 6;
WHEN (letter IN ('R','S','T')) index = 7;
WHEN (letter IN ('U','V')) index = 8;
WHEN (letter IN ('W','X')) index = 9;
WHEN (letter IN ('Y','Z')) index = 10;
OTHERWISE DO;
PUT "WARNING: Bad character in letter - " letter;
END;
END;
RUN;
Are you ready for the spotlight? We're accepting content ideas for SAS Innovate 2025 to be held May 6-9 in Orlando, FL. The call is open until September 25. Read more here about why you should contribute and what is in it for you!
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.