Posts

Showing posts from 2010

Easy way to UPCASE variable names of SAS dataset

Image
option VALIDVARNAME=UPCASE; Use trhe above option statement to upcase the variable name of the SAS dataset irrespective of type of variable in the dataset (character or numeric). The following example shows how the option sattement VALIDVARNAME=UPCASE works. proc contents data =sashelp.class out =test; run; Note: Propcase variable names.  *Upcasing the variables; option validvarname=upcase; proc sort data=sashelp.class out=test; run; Because of the option statement. Ex:  'Age'  becomes 'AGE' and 'Height' becomes 'HEIGHT' etc. See the SAS Language Reference dictionary to get more details. Another way to do this is to use a macro and I call it as UPCASE macro. proc sort data =sashelp.class out =test; by name; run ;   % macro upcase (lib,dsn); *Create a macro variable with the total number of variable count; data _null_; set sashelp.vtable(where=(libname="&LIB" and memname="&DSN")); ...

MDY Function

The MDY function converts MONTH, DAY, and YEAR values to a SAS date value. For example, MDY(10,19,1999) returns the SAS date value '19OCT99'D. Syntax:    MDY(month,day,year) Arguments month : specifies a numeric expression that represents an integer from 1 through 12. day     :specifies a numeric expression that represents an integer from 1 through 31. year    :specifies a two-digit or four-digit integer that represents the year. The YEARCUTOFF = system    option defines the year value for two-digit dates. If you know month, day, and year values, it’s very easy to derive date variable. You just need to use MDY function (of course, month, day, and year should be numeric). However, if the data is character then the conversion to numeric should occur first and then the conversion to the date value. Example: *When month, day, and year has numeric values; data test; year= 1999 ; month= 12 ; day= 19 ; newdate= mdy ...

Overview on CDISC Implementation

Image
CDISC Advantages CDISC has developed a set of data standards to enhance data collection, management, analysis, and reporting efficiencies, improve safety monitoring, and streamline the review and approval process for investigational treatments. Under the ICH’s electronic Common Technical Document (eCTD) guidance, CDISC Study Data Tabulation Model (SDTM) is the preferred standard for content format and structure of clinical data for all clinical studies. Based on proposed federal regulations, the FDA will mandate that all clinical trial submissions be in electronic format and that the content comply with data standards guidance. Veristat helps our clients by not only implementing these standards on a project or program, but also by providing our clients with an understanding of the CDISC standards. source:veristatinc.com   source: http://cro.businessdecision.com/ (' ’)

How to convert the datetime character string to SAS datetime value? (ANYDTDTM and MDYAMPM formats)

Image
When we have a string like this "9/01/2010 11:52:54 AM" and would like to translate the string to a numeric SAS date time variable, most of the times we use SCAN function to extract the information to get the DATETIME format. This is definitely a tedious job. SAS formats ( MDYAMPM, ANTDTDTM ) comes to rescue us. Here is how it works. data test ; length date $25 ; date=" 9/01/2010 11:52:54 AM "; *Convert the character string to SAS datetime value; datetimevar = input (date, mdyampm25.2 ); datetimevar1 = input (date, anydtdtm20. ); *Apply format to the SAS date time value; format datetimevar datetimevar1  datetime19. ; run ; Result: 01SEP2010:11:52:54 * ANYDTDTM and MDYAMPM informats work together when the datetime value has AM PM specified or day, month, and year components are not ambiguous. The MDYAMPMw . format writes datetime values with separators in the form mm/dd/yy hh:mm AM PM, and requires a space between the date and the time....

SAS Keyboard Shortcuts

Image
Here are the few shortcuts you need to know to speed up the code writing. These work in both EPG (Enterprise Guide) and SAS Enhanced Editor. Shortcuts and their descriptions: Remember that the keyboard shortcuts listed here are default. Selection Operations: 1) Comment the section with line comments (/): press CTL + / 2) Undo the comment: press CTL + SHIFT + / 3) Convert selected text to lowercase: press CTL + SHIFT + L 4) Convert selected text to uppercase: press CTL + SHIFT + U Shortcuts (pre-defined) CTRL+Shift+L or +U (only for the enhanced editor), which convert all selected text into lowercase or uppercase respectively. These become very handy  when we insert the text by copy+paste. 5) Indent selected section: press TAB 6) Un-indent selected section: press SHIFT + TAB 7) To move curser to the matching DO/END statement: press      ALT + [ or      ALT + { or        ALT+] or ...

Mastering Global and Local Macro Variables in SAS: Essential Techniques and Best Practices for SDTM Programmers

Mastering Global and Local Macro Variables in SAS: A Detailed Guide for SDTM Programmers Mastering Global and Local Macro Variables in SAS: A Detailed Guide for SDTM Programmers In SAS programming, especially when dealing with complex tasks such as SDTM (Study Data Tabulation Model) dataset creation, macro variables play a critical role in automating processes and managing large amounts of data efficiently. Understanding the distinction between Global and Local macro variables, and how to use them appropriately, is essential for writing clean, maintainable, and robust code. What are Macro Variables in SAS? Macro variables in SAS are placeholders that store text strings, which can be reused throughout your SAS programs. They are part of the SAS Macro Language and are used to make your code more dynamic and flexible. By using macro variables, you can avoid hardcoding values and make your code easier to modify and scale. There are two pri...

How to get the details of formats from the format libraries:

Image
If you are like me wanted to get the details of formats stored in the format library, here are two easy ways ….Proc catalog or Proc format Proc Catalog: Proc catalog will give us the details about name and type (numeric or character) of formats Syntax: proc catalog catalog = frmtdir.formats; contents ; run ; * FORMATS , is the name of the folder where all permanent formats are stored inside the library FRMTDIR . *If you want to get the details of temporary formats use WORK in place of frmtdir.formats; Proc Format: Use either SELECT or  EXCLUDE statements to choose the formats for which you want to get the details. Syntax: proc format library = frmtdir.formats; select locfmt; run ; This code will provide the details of LOCFMT in the FRMTDIR library. Below code gives complte information about what's stored in your format catalogs. libname frmtdir 'c:\saswork' ; proc format library =frmtdir.formats cntlout = formats; run ; Look at ...

Converting SAS datasets to SPSS

Image
If you want to view SAS dataset in SPSS you can use GET SAS command of SPSS. Here is the syntax; get sas data= 'C:\data\class.sas7bdat' . For conversion of SAS to SPSS we need to see if any formats assigned to variables in the dataset or not. If there are no formats then we just follow following steps to convert SAS dataset to SPSS. **STEP1: Creating .xpt file of a SAS dataset using Proc COPY.** libname SAS 'c:\sas\data\ '; libname SPSS xport 'c:\sas\data\class.xpt' ; proc copy in=sas out =spss; select class; run ; **STEP2: Use SPSS command to convert the transport format SAS file to SPSS;** You should use following commands to convert transport format file to SPSS data. get sas data='c:\sas\data\class.xpt'. execute. *******************************************************************************************; If there are formats then we need to convert the formats catalog to a SAS data set before converting the SAS dataset...

Delete observations from a SAS data set when all or most of variables has missing data

Image
/* Sample data set */ data missing; input n1 n2 n3 n4 n5 n6 n7 n8 c1 $ c2 $ c3 $ c4 $; datalines ; 1 . 1 . 1 . 1 4 a . c . 1 1 . . 2 . . 5 e . g h 1 . 1 . 3 . . 6 . . k i 1 . . . . . . . . . . . 1 . . . . . . . c . . . . . . . . . . . . . . . ; run; *If you want to delete observation  if the data for every variable is missing then use the following code; *Approach 1: Using the coalesce option inside the datastep; data drop_misobs; set missing; if missing(coalesce(of _numeric_)) and missing(coalesce(of _character_)) then delete ; run ;   Pros: *Simple code Cons; *This code doesn't work if we want to delete observation based on specific variables and not all of them. *Approach 2:Using N/NMISS option inside the datastep; data drop_missing; set missing; *Checks the Non missing values using ; if n(n1, n2, n3, n4, n5, n6, n7, n8, c1, c2, c3, c4)=0 then delete ; run; data drop_missing; set missing; *Checks the missing values us...

Diffrence Between RUN and QUIT statements

Folkes,  Here is the answer from Andrew Karp..... Direct link ****************************************************************************************************; Allow me to weigh in on this topic. It comes up alot when I give SAS training classes. First, RUN and QUIT are both " explicit step boundaries " in the SAS Programming Language. PROC and DATA are "implied step boundaries." Example 1: Two explicit step boundaries. DATA NEW; SET OLD: C = A + B; RUN ; PROC PRINT DATA=NEW; RUN ; In this example, both the data and the proc steps are explicitly "ended" by their respective RUN statements. Example 2: No explicit step boundaries. DATA NEW; SET OLD; C = A + B; PROC PRINT DATA=NEW; In this example, the data step is implicitly terminated by the PROC statement. But, there is no step boundary for the PROC PRINT step/task, so it will not terminate unless/until the SAS supervisor "receives" a step boundary. Some PROCS support what is c...

Sending the LOG and OUTPUT from PC SAS to a seperate file

Image
Here is how to direct the SAS LOG file and or SAS Output  to a seperate file. Approach 1: Using Display Manager Statements; filename log ' C:\temp\logfile.log '; filename out ' C:\temp\output.lst '; *Select only male students and age less than 16; proc sql; create table males as select age, height, weight from sashelp.class where sex=' M ' and age lt 16  order by age; quit; *Get the descriptive statistics for height variable by age; proc means data =males ; by age; var height; output out =htstats mean =mean n =n std =sd median =med min =min max =max; run; DM ' OUT;FILE OUT REP; '; DM ' LOG;FILE LOG REP; '; Information about Display Manager Commands: DEXPORT and DIMPORT: DISPLAY MANAGER commands used to IMPORT and EXPORT the Tab delimited (Excel and .CSV) files; SAS Display Manager Commands Approach 2: Using Proc PRINTTO procedure; Refer:  How to save the log file or what is PROC PRINTTO procedur...

Random Sample Selection

Image
Last week my manager asked me to randomly pick 10%observations from a large data set and then create a listing so that the Data management programmers can QC the data. I want to share some thoughts here … how easy and simple to do random sampling. Approach 1: Data step Approach: In this approach, the observations are shuffled using the RANUNI function which assigns a random number to each observation. Step1 : Generating the Random Vector (shuffling) using the RANUNI function; The RANUNI function generates a random number from a continuous uniform distribution (the interval (0, 1). Step2 : After assigning a random number to each record, the records can then be sorted in ascending or descending order of the random numbers.; data randsamp ; input patno @@; random= RANUNI ( -1 ); * RANUNI function to assign a random number to each record.; * Here the seed is negative integer (-1) so the results are not replicable.; cards; 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 2...

WARNING: You may have unbalanced quotation marks.

Image
SAS can allow the strings up to 32,767 characters long but some times SAS will write a Warning message ‘ WARNING: The quoted string currently being processed has become more than 262 characters long. You may have unbalanced quotation marks. ’ , when you try to keep a character string longer than 262 characters to a variable.  It is hard to look back at the SAS code to search for unbalanced quotes. To make it more clearly I am going to show an example. I want to add a 263 characters long name to a variable (longvar) and to do that I will simply use a data step… and when I do that I will see the WARNING message in Log. data TEST; x=" (SEE DOCTOR'S LETTER)3RD ADMINISTRATION OF MTX WAS DELAYED BY 14 DAYS AND WAS REDUCED TO 1G/M2 INSTEAD OF 5G/M2, PROBLEMS, E.COLI SEPSIS WITH HEART INSUFFICIENCY WITH SINUS TACHYCARDY, PARALYTIC ILEUS, TACHYPNEA , PATIENT DIED ON 21.04.98 FROM MULTIORGAN FAILURE. "; y=length(x); put x; run ; LOG FILE: There is a SAS option (NOQUO...

CALL EXECUTE: Easy way to print or sort multiple files.

When printing multiple files, or sorting multiple datasets, the traditional method is to write multiple steps as below. Proc print data =libref.ae; var _all_; run; Proc print data =libref.conmed; var _all_; run; Proc print data =libref.demog; var _all_; run; Proc print data =libref.lab; var _all_; run; Proc print data =libref.medhist; var _all_; run; If you are like me who likes to simplify the traditional SAS code here is the tip. CALL EXECUTE comes to rescue here. *Using Disctionary Tables and Call Execute; proc sql ; create table dsn as select distinct memname from dictionary.tables where libname=" LIBREF " and memtype=" DATA "; quit ; *Sorts all the datasets using Call Execute; data _null_ ; set dsn; call execute (" proc sort data=final .||'memname||'; by usubjid; run ;"); run ; *Prints all the datasets using Call Execute; data _null_ ; set dsn; call execute (" proc print data=final .||...

Write a Letter using SAS/ Emailing with SAS

SAS can do many things which most of us don’t have a clue. Here is one example…. Writing a letter: filename formltr ' C:\Documents and Settings\sreddy\Desktop\formltr.rtf ' ; data address; infile datalines; input @ 1 stno  @ 6 lane $12. @ 19 aptno $7. @ 27 city $9. @ 37 state $2. @ 40 zip ; datalines ; 2550 Augusta Blvd Apt#203 Fairfield OH 45014 ; run ; data _null_; retain lm 5; set address; file formltr;* print notitles; put _page_; adr1 = trim(stno) ' ' trim(lane); put @lm adr1; adr2 = trim(aptno); put @lm adr2; adr3 = trim(city) ||', '|| trim(state) ||' '|| trim(zip); put @lm adr3; adr4 = trim('Dear')|| ' ' ||trim('SAS') || ' ' || trim('Users,'); put / @lm adr4; put / @lm ' StudySAS Blog offers a lot of information regarding tips and tutorials on various topics ' ; put @lm ' in SAS. It covers basics to get started to more in-depth topics like Mac...