SAS Programming

DATA Step, Macro, Functions and more
BookmarkSubscribeRSS Feed
🔒 This topic is solved and locked. Need further help from the community? Please sign in and ask a new question.
saslove
Quartz | Level 8

Does the length of the variable have anything to do with this statement? 

My variable length for "c" is $9. And it doesn't work as expected. 

What am I missing? 

 

proc sql;
create table test as 
select c from mydata
order by mod(input(c,bits24.)+1,10);
quit; /* assuming ASCII encoding */
FreelanceReinh
Jade | Level 19

@saslove wrote:

(...) it doesn't work as expected. 

order by mod(input(c,bits24.)+1,10);

Hi @saslove,

 

My suggestion was tailored to the eight treatment codes 'A1Y', 'A1Z', ..., 'P' (and their desired sort order) from your initial post. In particular, the parameter values 7 and 27 in

order by mod(input(c,bits24.)+7,27);

were critical. So, it's not surprising that the trick fails if you change these values to 1 and 10, respectively, without a good reason.


Does the length of the variable have anything to do with this statement? 

My variable length for "c" is $9.

The maximum length (3) of your original treatment codes went into the length of the BITSw. informat: 8 bits per character, hence w=24.

 

It doesn't matter if the defined length of the character variable is greater than 3. (In my code example it was 8.) The BITS24. informat reads only the first 24 bits, i.e., the first 3 characters.

 

If your real treatment codes were longer than 3 characters (e.g. 'Placebo'), the length of the informat would need to be increased. The maximum length is 64 (bits), i.e. 8 characters, though. Also, with a different set of treatment codes the parameter values (7, 27) would change almost certainly. Even worse, it's not guaranteed that suitable values exist at all.

 

I would not recommend this type of solution for production code, e.g., in a clinical research project. That's why I called it a "fun fact." For practical purposes the solutions provided by novinosrin, mkeintz, ballardw and hashman are clearly preferable because they are much more transparent and stable and easier to adapt (e.g. to new treatment codes).

 

That said, feel free to post a different set of treatment codes and their desired sort order. Then I can try to come up with another "fun" solution (just for demonstration what's possible with SAS-supplied [in]formats and functions).

saslove
Quartz | Level 8

Thanks! That makes sense, thanks for all the explanation. It really helps me understand this code. 
For production, I have used @novinosrin's method. 
I did want to try out what @FreelanceReinh suggested, so I was trying on a test window. 

ChrisNZ
Tourmaline | Level 20

As @FreelanceReinh said, do not use his [very] clever demonstration in production. 

1. This code is very hard to maintain. Do you understand it? Can you explain it? Did you document it properly?

2. It can give unwanted results if the variable is given new values.

 

sas-innovate-white.png

Special offer for SAS Communities members

Save $250 on SAS Innovate and get a free advance copy of the new SAS For Dummies book! Use the code "SASforDummies" to register. Don't miss out, May 6-9, in Orlando, Florida.

 

View the full agenda.

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
  • 18 replies
  • 8884 views
  • 17 likes
  • 7 in conversation