BookmarkSubscribeRSS Feed
skibur
Fluorite | Level 6

Hi everyone,

 

I was given a dataset with first name and last name variables and asked to concatonate these and then order the full name alphabetically. I have managed to concatonate the names but I am struggling to order the full name. Hopefully the example below will clear things up.

 

Data I had:

fname     sname

Jim         Smith

Tom        Bell

 

Data currently:

fullname

JimSmith

TomBell

 

Data I need:

fullname2

hiiJmmSt

BellmoT

 

Apologies if this has been answered but I have not found anything on my searches!

 

Thanks in advance

11 REPLIES 11
HB
Barite | Level 11 HB
Barite | Level 11
This looks like homework. My guess would be you would set up a loop to break each concatenated name into individual characters, dump them in an array one by one, sort the array, and output the contents.
skibur
Fluorite | Level 6
I can see why it looks like homework! But no its for a work project and I am a relative beginner and it was causing me issues. I wouldnt have came to here without having a go myself.

Thanks for the advice, it is much appreciated!
novinosrin
Tourmaline | Level 20

Data currently;

input fullname $20.;

datalines;

JimSmith

TomBell

;

data want;

set currently;

array t(50) $  _temporary_;

call missing(of t(*));

do _n_=1 to length(strip(fullname));

t(_n_)=lowcase(char(fullname,_n_));

end;call sortc(of t(*));newname=cats(of t(*));run;

skibur
Fluorite | Level 6
Thank you so much. I will try to understand this.
BrunoMueller
SAS Super FREQ
Have a look at the CALL SORTC routine.
Define an array, put your chars into the array elements and then use the CALL SORTC.

What is the use case for this data manipulation?
skibur
Fluorite | Level 6
Thanks for your advice. I dont want to say too much but its for data matching with another work data set.
HB
Barite | Level 11 HB
Barite | Level 11

data matching with another work data set.

 

Hmm.  "Tim Mott" and "Tom Mitt" will not match in name form, but will match in sorted anagram form. That could be interesting.

Andygray
Quartz | Level 8

@skibur  I think your question has been answered. Please close the thread. It's way too simple question

HB
Barite | Level 11 HB
Barite | Level 11
Not that simple for me.
bodowd
Calcite | Level 5

Using compress with the whole alphabet at the first argument, your text as second argument, and 'k' modifier to keep letters for the alphabet as they appear.

 

data test;
input fname $ sname $ ;
datalines;
John Smith
Tom Bell
;

data test;
	set test;
	fullname = cats(fname, sname);
	fullname2 = compress('AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz', fullname, 'k');
run;
mkeintz
PROC Star

@bodowd wrote:

Using compress with the whole alphabet at the first argument, your text as second argument, and 'k' modifier to keep letters for the alphabet as they appear.

 

data test;
input fname $ sname $ ;
datalines;
John Smith
Tom Bell
;

data test;
	set test;
	fullname = cats(fname, sname);
	fullname2 = compress('AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz', fullname, 'k');
run;

@bodowd :  Very nice, because you can trivially change the desired order of characters in the result:

 

data test;
	set test;
	fullname = cats(fname, sname);
	fullname2 = compress('AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz', fullname, 'k');
	fullname3 = compress('ZzYyXxWwVvUuTtSsRrQqPpOoNnMmLlKkJjIiHhGgFfEeDdCcBbAa', fullname, 'k');
run;

But be careful - In the absence of a LENGTH declaration, the resulting FULLNAME2 and 3 lengths are determined by the first argument of the compress function - i.e. length 52 in this case.

 

Also, letters that appear more than once in the original, appear only once in the result.

--------------------------
The hash OUTPUT method will overwrite a SAS data set, but not append. That can be costly. Consider voting for Add a HASH object method which would append a hash object to an existing SAS data set

Would enabling PROC SORT to simultaneously output multiple datasets be useful? Then vote for
Allow PROC SORT to output multiple datasets

--------------------------

SAS Innovate 2025: Call for Content

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!

Submit your idea!

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.

Click image to register for webinarClick image to register for webinar

Classroom Training Available!

Select SAS Training centers are offering in-person courses. View upcoming courses for:

View all other training opportunities.

Discussion stats
  • 11 replies
  • 5530 views
  • 13 likes
  • 7 in conversation