SAS Input v. Put Functions

Post on 07-Aug-2015

302 views 0 download

Tags:

Transcript of SAS Input v. Put Functions

INPUT VSPUT

MSUG | Donna Chan | August 29, 2012

FUNCTIONS

WIIFM BREW SOME SAS-SY

GOODNESS

INPUT+PUT FUNCTIONS

? ()

WIIFM?

123 abc

INPUT+PUT FUNCTIONS ( )

text in

text out

input ;

text in

text out

input ;

put ;

text in

text out

INPUT/PUT statements and functions

are close cousins.

; ()

input()

put()

text in

text out

input()

put()

text in

text out

input()

new = input(old, informat.) ;

abc123

abc123

date_char

‘05282012’

‘06012012’

‘07052012’

new = input(old, informat.) ;

date_num

19141

19145

19179

input()

abc123

date_char

‘05282012’

‘06012012’

‘07052012’

date_num = input(date_char, mmddyy8.) ;

date_num

19141

19145

19179

input()

abc123

date_char

‘05282012’

‘06012012’

‘07052012’

date_num = input(date_char, mmddyy8.) ;

date_num

19141

19145

19179

input()

abc123

date_char

‘05282012’

‘06012012’

‘07052012’

date_num = input(date_char, mmddyy8.) ;

date_num

19141

19145

19179

input()

E

abc123

date_char

‘05282012’

‘06012012’

‘07052012’

date_num = input(date_char, mmddyy8.) ;

date_num

05/28/2012

06/01/2012

07/05/2012

format date_num mmddyy10. ;

input()

C

abc123

date_char

‘05282012’

‘06012012’

‘07052012’

date_num = input(date_char, mmddyy8.) ;

date_num

05/28/2012

06/01/2012

07/05/2012

format date_num mmddyy10. ;

input()

C

I

abc123

some_num

05282012

06012012

07052012

date_num = input(some_num, mmddyy8.) ;

date_num

?

format date_num mmddyy10. ;

input()

abc123

some_num

05282012

06012012

07052012

date_num = input(some_num, mmddyy8.) ;

date_num

.

.

.

format date_num mmddyy10. ;

input()

abc123

some_num

05282012

06012012

07052012

date_num

.

.

.

format date_num mmddyy10. ;

input()

NOTE: Numeric values have been converted to

character values at the places given by:

(Line):(Column).

date_num = input(some_num, mmddyy8.) ;

Old var is always char.

Format dates.

❶ ❷ ❸

input()

If old var is num, SAS returns note.

abc123

new = input(old, informat.) ;

Informat describes how old var appears—in new var type.

input()

put()

text in

text out

new = put(old, format.) ;

put() 123abc

123abc

ID_num

.

1245

35

659845

new = put(old, format.) ;

ID_char

19141

19145

19179

put()

123abc

ID_char = put(ID_num, z6.) ;

ID_num

.

1245

35

659845

put()

ID_char

‘ .’

‘001245’

‘000035’

‘659845’

123abc

ID_char = put(ID_num, z6.) ;

ID_num

.

1245

35

659845

ID_char

‘ .’

‘001245’

‘000035’

‘659845’

put()

E

123abc

else ID_char = put(ID_num, z6.) ;

ID_num

.

1245

35

659845

ID_char

‘’

‘001245’

‘000035’

‘659845’

if ID_num eq . then ID_char = ‘’ ;

put()

C

123abc

ID_char = put(ID_num, z6.) ;

ID_num

.

1245

35

659845

ID_char

‘ .’

‘001245’

‘000035’

‘659845’

I

put()

123abc

ID_char = put(ID_num, $6.) ;

ID_num

.

1245

35

659845

ID_char

? ’

put()

123abc

ID_num

.

1245

35

659845

ID_char

‘ .’

‘ 1245’

‘ 35’

‘659845’

put()

ID_char = put(ID_num, $6.) ;

123abc

ID_num

.

1245

35

659845

ID_char

‘ .’

‘ 1245’

‘ 35’

‘659845’

WARNING: Variable ID_num has already

been defined as numeric.

put()

ID_char = put(ID_num, $6.) ;

put()

New var is always char.

Hardcode missings.

❶ ❷ ❸ Using new var format type will throw warning.

123abc

new = put(old, format.) ;

Format describes what the new var looks like—in old var type.

SAS-SY GOODNESS

BREW SOME

round 1 abc abc ?

round 1

ID_new

‘000451’

‘000934’

‘005660’

‘049712’

‘180456’

‘196245’

abc abc ?

ID_old

‘451’

‘934’

‘5660’

‘49712’

‘180456’

‘196245’

round 1 abc abc

ID_old

‘451’

‘934’

‘5660’

‘49712’

‘180456’

‘196245’

ID_new

‘000451’

‘000934’

‘005660’

‘049712’

‘180456’

‘196245’

ID_new = put(input(ID_old, 6.0), z6.0) ;

ID_new = put(input(ID_old, 6.0), z6.0) ;

ID_old

‘451’

‘934’

‘5660’

‘49712’

‘180456’

‘196245’

char

round 1 abc abc

ID_new = put(input(ID_old, 6.0), z6.0) ;

(inter_num)

451

934

5660

49712

180456

196245

ID_old

‘451’

‘934’

‘5660’

‘49712’

‘180456’

‘196245’

char num

round 1 abc abc

ID_new = put(inter_num, z6.0) ;

(inter_num)

451

934

5660

49712

180456

196245

ID_old

‘451’

‘934’

‘5660’

‘49712’

‘180456’

‘196245’

char num

round 1 abc abc

ID_new = put(inter_num, z6.0) ;

(inter_num)

451

934

5660

49712

180456

196245

ID_old

‘451’

‘934’

‘5660’

‘49712’

‘180456’

‘196245’

char num

round 1 abc abc

ID_new

000451

000934

005660

049712

180456

196245

(inter_num)

451

934

5660

49712

180456

196245

ID_old

‘451’

‘934’

‘5660’

‘49712’

‘180456’

‘196245’

char num char

round 1 abc abc

ID_new = put(inter_num, z6.0) ;

new = put(input(old, 6.0), z6.0) ;

round 1

Nest functions when going from char to char.

Don’t be afraid; break it down step-by-step.

❶ ❷

abc abc

round 2 custom informat: abc 123 ?

gpa_char

‘A-’

‘B+’

‘C’

‘B-’

‘B’

‘D’

gpa_num

‘000451’

‘000934’

‘005660’

‘049712’

‘180456’

‘196245’

round 2 custom informat: abc 123 ?

if gpa_char in ('A+' 'A') then gpa_num = 4.0 ;

else if gpa_char = 'A-' then gpa_num = 3.7 ;

else if gpa_char = 'B+' then gpa_num = 3.3 ;

else if gpa_char = 'B' then gpa_num = 3.0 ;

else if gpa_char = 'B-' then gpa_num = 2.7 ;

else if gpa_char = 'C+' then gpa_num = 2.3 ;

else if gpa_char = 'C' then gpa_num = 2.0 ;

else if gpa_char = 'D' then gpa_num = 1.0 ;

else if gpa_char = 'F' then gpa_num = 0 ;

else gpa_char = '' ;

round 2 custom informat: abc 123

proc format;

invalue gpafmt ‘A+’ = 4.0

‘A’ = 4.0

‘A-’ = 3.7

‘B+’ = 3.3

‘B’ = 3.0

‘B-’ = 2.7

‘C+’ = 2.3

‘C’ = 2.0

‘D’ = 1.0

‘F’ = 0 ;

run;

gpa_num = input(gpa_char, gpafmt.);

round 2 custom informat: abc 123

round 2

gpa_char

‘A-’

‘B+’

‘C’

‘B-’

‘B’

‘D’

gpa_num

3.7

3.3

2.0

2.7

3.0

1.0

custom informat: abc 123

gpa_num = input(gpa_char, informat.);

round 2

gpa_char

‘A-’

‘B+’

‘C’

‘B-’

‘B’

‘D’

gpa_num

3.7

3.3

2.0

2.7

3.0

1.0

custom informat: abc 123

round 2

gpa_char

‘A-’

‘B+’

‘C’

‘B-’

‘B’

‘D’

gpa_num

3.7

3.3

2.0

2.7

3.0

1.0

gpa_num = input(gpa_char, gpafmt.);

custom informat: abc 123

proc format;

invalue gpafmt ‘A+’ = 4.0

‘A’ = 4.0

‘A-’ = 3.7

‘B+’ = 3.3

‘B’ = 3.0

‘B-’ = 2.7

‘C+’ = 2.3

‘C’ = 2.0

‘D’ = 1.0

‘F’ = 0 ;

run;

new = input(old, custominfmt.) ;

round 2 custom informat: abc 123

Convert from char to num not just in type but also content.

Powerful for simplifying code.

❶ ❷

bonus round custom format: 123 abc ?

gpa_avg

3.50000

2.66667

2.31540

1.34500

3.95000

2.45150

...

gpa_letter

3.7

3.3

2.0

2.7

3.0

1.0

if 0 =< gpa_avg < 0.7 then gpa_letter = ‘F’ ;

else if 0.7 =< gpa_avg < 1.7 then gpa_letter = ‘D’ ;

else if 1.7 =< gpa_avg < 2.7 then gpa_letter = ‘C’ ;

else if 2.7 =< gpa_avg < 3.7 then gpa_letter = ‘B’ ;

else if 3.7 =< gpa_avg < 4.0 then gpa_letter = ‘A’ ;

else if gpa_avg = . then gpa_letter = ‘’ ;

bonus round custom format: 123 abc ?

proc format ;

value gpafmt 0 -< 0.7 = 'F'

0.7 -< 1.7 = 'D'

1.7 -< 2.7 = 'C'

2.7 -< 3.7 = 'B'

3.7 - 4.0 = 'A' ;

run ;

gpa_letter = put(gpa_avg, gpafmt.);

bonus round custom format: 123 abc

bonus round

gpa_avg

3.50000

2.66667

2.31540

1.34500

3.95000

2.45150

...

gpa_letter

3.7

3.3

2.0

2.7

3.0

1.0

custom format: 123 abc

bonus round

gpa_letter = put(gpa_avg, format.);

custom format: 123 abc

gpa_avg

3.50000

2.66667

2.31540

1.34500

3.95000

2.45150

...

gpa_letter

3.7

3.3

2.0

2.7

3.0

1.0

bonus round

gpa_letter = put(gpa_avg, format.);

custom format: 123 abc

gpa_avg

3.50000

2.66667

2.31540

1.34500

3.95000

2.45150

...

gpa_letter

3.7

3.3

2.0

2.7

3.0

1.0

proc format ;

value gpafmt 0 -< 0.7 = 'F'

0.7 -< 1.7 = 'D'

1.7 -< 2.7 = 'C'

2.7 -< 3.7 = 'B'

3.7 - 4.0 = 'A' ;

run ;

bonus round

gpa_letter = put(gpa_avg, gpafmt.);

custom format: 123 abc

gpa_avg

3.50000

2.66667

2.31540

1.34500

3.95000

2.45150

...

gpa_letter

3.7

3.3

2.0

2.7

3.0

1.0

proc format ;

value gpafmt 0 -< 0.7 = 'F'

0.7 -< 1.7 = 'D'

1.7 -< 2.7 = 'C'

2.7 -< 3.7 = 'B'

3.7 - 4.0 = 'A' ;

run ;

bonus round

gpa_avg

3.50000

2.66667

2.31540

1.34500

3.95000

2.45150

...

gpa_letter

‘B’

‘C’

‘C’

‘D’

‘A’

‘C’

...

gpa_letter = put(gpa_avg, gpafmt.);

custom format: 123 abc

proc format ;

value gpafmt 0 -< 0.7 = 'F'

0.7 -< 1.7 = 'D'

1.7 -< 2.7 = 'C'

2.7 -< 3.7 = 'B'

3.7 - 4.0 = 'A' ;

run ;

new = put(old, customfmt.) ;

Convert from num to char not just in type but also content.

Powerful for clarifying output.

❶ ❷

bonus round custom format: 123 abc

FOLD

TACK ENJOY

CONTACT

REFERENCES

Donna Chan

ext 8883

room 1864

donna.chan@mdrc.org

1 – An Animated Guide: Using the Put and Input Functions | 2008

by Russ Lavery & Alejandro Jaramillo

2 – Using PROC FORMAT to Create Dynamic Lookups | 2012

by Jed Teres

3 – Five Things Every Presenter Should Know About People | 2012

by Brain Pickings