Monday, March 27, 2017

Hack 4.17 Sorting Variables Within an Observation


SAS Programming Professionals,

Did you know that you can sort the values of variables within an observation into ascending order? 

The SORTN CALL routine allows you to do just that.  Here is an example:

options nodate nonumber;

/* Create the Test data set*/
proc sort in=sashelp.mdv out=work.mdv(keep=origcity shipdate);
      by origcity;
run;

proc transpose data=mdv out=mdvtrans prefix=date;
      by origcity;
      var shipdate;
run;

/* Print the obs with unsorted dates */
proc print data=mdvtrans;
title1 "Dates Not Sorted";
run;

/* Use the SORTN call routine to sort dates */
data sorted_MDV_dates;
set  mdvtrans;

array sortdate{28} date1 - date28;

call sortn (of sortdate(*));

run;

/* Print the obs with sorted dates */
proc print data=sorted_mdv_dates;
title1 "Dates Sorted";
run;

The first part of the program sets up the data set that we will use in the DATA Step that is highlighted in red.  The first steps create a SAS data set with 28 date variable in it.  That data set is output in the first PROC PRINT.  In the DATA Step we use the SORTN to sort the dates (DATE1 – DATE28) into ascending order.  The second PROC PRINT reveals that DATE1 – DATE28 have been sorted into ascending date sequence.  One statement; it’s that simple!

CALL SORTN can be useful in cases where you need to order a series of event dates in an observation for a particular subject id.  Note that its twin function, CALL SORTC, can be used to sort character variables into ascending order within an observation.

Best of luck in all your SAS endeavors!

---MMMMIIIIKKKKEEEE
(aka Michael A. Raithel)
Author of the new cult classic for computer programmers:  It Only Hurts When I Hit <ENTER>
Print edition:  http://tinyurl.com/z8bzx2e 
Kindle edition: http://tinyurl.com/zypgqa7 

The hack above is an excerpt from the book:  Did You Know That?  Essential Hacks for Clever SAS Programmers

Monday, March 13, 2017

Hack 4.16 Simplifying IF/THEN/ELSE Statements Using the IFC and IFN Functions


SAS Programming Professionals,

Did you know that the IFC and IFN functions allow you to have 1-line IF/THEN/ELSE-like statements? 

The IFC and IFN functions can be handy when you have a single THEN condition and a single ELSE condition and you would like to have an action taken if the test condition results in missing values.

The IFC function returns a character value based on whether or not an expression is true, false, or missing.  The basic form of the function is:

               IFC(logical-expression, value-returned-when-true, value-returned-when-false <,value-returned-when-missing>)

Here is an example:

data class_gender;
set  sashelp.class;

length gender $7;
label gender = "Gender";

gender = ifc(sex="M", "Male  ", "Female", "Unknown");

run;

In the example, we test variable SEX for the value “M”.  If SEX = “M”, the variable GENDER is set to “Male”.  If not, it is set to “Female”.  If SEX contains a missing value, it is set to “Unknown”.

The IFN function returns a numeric value based on whether or not an expression is true, false, or missing.  The basic form of the function is:

               IFN(logical-expression, value-returned-when-true, value-returned-when-false <,value-returned-when-missing>)

Here is an example:

data electric_surcharge;
set  sashelp.electric;

label surcharge = "Surcharge (B)";

surcharge = ifn(year=2005, revenue *.001, revenue * .000025, 0);

run;

In the example, we test the variable YEAR for the numeric value of 2005.  If YEAR = 2005, the variable SURCHARGE is set to REVENUE * .001.  If YEAR does not equal 2005, SURCHARGE is computed to be REVENUE * .000025.  If YEAR contains missing values, SURCHARGE is set to Zero.

You can probably think of dozens of uses for the IFC and IFN functions.  I like to think of these two functions as “IF/THEN/ELSE in a can”.

Best of luck in all your SAS endeavors!

---MMMMIIIIKKKKEEEE
(aka Michael A. Raithel)
Author of the new cult classic for computer programmers:  It Only Hurts When I Hit <ENTER>
Print edition:  http://tinyurl.com/z8bzx2e 
Kindle edition: http://tinyurl.com/zypgqa7 

The hack above is an excerpt from the book:  Did You Know That?  Essential Hacks for Clever SAS Programmers

Monday, March 6, 2017

Hack 4.15 Setting Multiple Variables to Missing in a Single Statement


SAS Programming Professionals,

Did you know that you can easily set one or more SAS variables to missing values in a single statement?

The CALL Missing SAS call routine allows you to set character and numeric variables to missing values.  Call Missing sets numeric variables to numeric missing (.), and character variables to character missing (blank).  The basic format is:

CALL MISSING(varname1<, varname2, ....>);

Here is an example:

data vetted_class;
set  sashelp.class;

if age < 14 then call missing(weight, height, sex);

run;

In the example, we have specific criteria for setting variables to missing—when the subject is younger than 14 years old.  When that is the case, we set the values of weight, height, and sex to missing.  Note that weight and height are numeric variables, while sex is a character variable.  It makes no difference at all to CALL MISSING; it sets them all to missing!

Best of luck in all your SAS endeavors!

---MMMMIIIIKKKKEEEE
(aka Michael A. Raithel)
Author of the new cult classic for computer programmers:  It Only Hurts When I Hit <ENTER>
Print edition:  http://tinyurl.com/z8bzx2e 
Kindle edition: http://tinyurl.com/zypgqa7 

The hack above is an excerpt from the book:  Did You Know That?  Essential Hacks for Clever SAS Programmers