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

Dear all,

I have 2 ordinal variables (quintiles). 

Now I want to create a new categorical variable which combine all levels of those ordinal ones.

So my new var will have 25 categories.

Using if statement is really not a good solution.

Could anyone help me out with some tricks?

Thank you.

1 ACCEPTED SOLUTION

Accepted Solutions
mkeintz
PROC Star

@Minhtrang wrote:

Thank you very much, RW9, for your reply.

2 variables quintiles of Na and K are ordinal variables. They were created from Proc rank with the continuous variables of Na, K.

 

 


This suggests to me you already have a data set created by 2 proc ranks, say variables Narank and Krank for each observation in the data set.  If so, I suspect you want something like:

 

data want;

  set have;

  composite_rank=catx('_',narank,krank);

run;

 

This will create a character variable composite_rank as "1_1", "1_2", ...  "5_4", "5_5".  The CATX function works without objection enve when narank and krank are numerics.

 

If you want a numeric composite variable, then something like

  composite_rank=10*narank+krank;

 

Just remember though: the numeric version assumes that krank is never more than 1 digit.  If krank reachs 2 digits (say deciles 1 to 10), you have to multiple narank by 100.

 

A final note: the default of proc rank is to make qunitles 0 to 4 rather than 1 to 5.  In that case, the number version of the composite will show only 1 digit when narank=0 - a good reason to make a character composite.

 

 

--------------------------
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

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

View solution in original post

9 REPLIES 9
RW9
Diamond | Level 26 RW9
Diamond | Level 26

Please reveiw the guidance found underneath the Post button on post a new question:

Capture.PNG

 

Without anything to work with I can't really say anything.

Jagadishkatam
Amethyst | Level 16

Could you please present the sample data and the expected categorical output. This will help to get better response.

 

 

I believe using the format we could create the categorical variables, but a sample data will help me to confirm.

 

Thanks,
Jag
Minhtrang
Obsidian | Level 7

Quintile of Na

Quintile of K NaKgroup
1 1 11
2 2 12
3 3 13
4 4 14
5 5 15
    21
    22
    23
    24
    25

Dear all,

 

My data looks as the table above. 

I have 2 variables which are quintiles of Na and K (so each of them has 5 levels: 1st, 2nd,...5th quintile).

Now I want to create new var as NaKgroup which combines those 2 quintiles variables. This new variable will have 25 categories.

 

RW9
Diamond | Level 26 RW9
Diamond | Level 26

Again:  Please post test data in the form of a datastep.

As such I now need to ask the question, are those variables nunmeric?  Also, why do the first two columns only appear in the first five rows?

Something like:

data want;
  set have;
  nakgroup=input(cats(put(quit_na,best.),put(quint_k)),best.);
run;

Assuming both columns are numeric and you want numeric result.

Minhtrang
Obsidian | Level 7

Thank you very much, RW9, for your reply.

2 variables quintiles of Na and K are ordinal variables. They were created from Proc rank with the continuous variables of Na, K.

 

Sorry I don't have SAS on the current PC so I can't post test data. 

I just looked for hints. 

I think I'll try your suggested solution with input statement.

 

mkeintz
PROC Star

@Minhtrang wrote:

Thank you very much, RW9, for your reply.

2 variables quintiles of Na and K are ordinal variables. They were created from Proc rank with the continuous variables of Na, K.

 

 


This suggests to me you already have a data set created by 2 proc ranks, say variables Narank and Krank for each observation in the data set.  If so, I suspect you want something like:

 

data want;

  set have;

  composite_rank=catx('_',narank,krank);

run;

 

This will create a character variable composite_rank as "1_1", "1_2", ...  "5_4", "5_5".  The CATX function works without objection enve when narank and krank are numerics.

 

If you want a numeric composite variable, then something like

  composite_rank=10*narank+krank;

 

Just remember though: the numeric version assumes that krank is never more than 1 digit.  If krank reachs 2 digits (say deciles 1 to 10), you have to multiple narank by 100.

 

A final note: the default of proc rank is to make qunitles 0 to 4 rather than 1 to 5.  In that case, the number version of the composite will show only 1 digit when narank=0 - a good reason to make a character composite.

 

 

--------------------------
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

--------------------------
Minhtrang
Obsidian | Level 7

Dear mkeintz,

 

You understood my problem so well.

Categorical variable is my desired outcome.

Thank you so much for your explanation in depth as well as the given optimal solution.

 

Best,

Trang

 

 

Ksharp
Super User

Cartesian Product.

 

proc sql;

select cats(na,k) as new

 from 

(select distinct na from have),

(select distinct k from have)

;

quit;

avishek2411
Calcite | Level 5

You can try below:

 

proc sql;
select cat(t1.NA,t2.K) as NAK
from temp t1,
temp t2;
run;

sas-innovate-2024.png

Join us for SAS Innovate April 16-19 at the Aria in Las Vegas. Bring the team and save big with our group pricing for a limited time only.

Pre-conference courses and tutorials are filling up fast and are always a sellout. Register today to reserve your seat.

 

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.

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
  • 9 replies
  • 5099 views
  • 6 likes
  • 6 in conversation