数据类型
在其他编程语言中,有各种各样的数据类型,但是总体上,可大致分为:数值型,字符型和日期型,而SAS中的数据类型,只有2中数据类型:字符型和数值型。在这里,你会发现,日期型的去哪了?在SAS程序中,日期默认是作为数值型的,所有的日期类型的变量都会被作为输入日期与1960年1月1日之差。例如今天是20191208,它显示的就是21891(这个数字哪来的,你猜猜?),如果你想显示成日期型,那么你得设定相应的日期格式。这个怎么个相应的日期格式,就是咱们下面讲的格式化。
SAS变量的输入格式
输入格式:input 变量1 输入格式1 变量2 输入格式2 ...;
1.数值型的输入格式
数值型的数据格式主要是w.d。其中w表示数值的总位数或者说宽度(包括小数点),d表示数值的小数部分的位数,如6.2表示:数据宽度是6,2位小数点,整数位是4。2. 表示总位数是2,没有小数点。
由左边图显示:咱们输入性别代码,1和2,理论上应该都是整数,但是你加了小数位数,有2位小数,但是实际上没有,SAS会把自己默认降为小数,并且满足2位小数的宽度。你看这就和你想要的数据不一样了
所以,在做程序设计的时候,一定要设置好,数据格式。
练一练:看看下面的例子,看看是否跟你想象中要展示的数据是否一样?
2.字符串输入格式
字符串变量的输入格式是$ w. 其中$符号是必须加的,w表示字节数,一个中文占2个字节,SAS的默认宽度是8,如果超过8位,需要加上宽度值,以保证能够全部读上,否则就只会读8位,多余的截掉,以下示例:
看到无论是数值型,还是字符型,貌似宽度后面都有.,这个“.”,是必须加的,只要有宽度值,就必须加".",否则,让你看一下结果:
3.日期型输入格式
日期型输入格式有很多,下面列表展示了几种输入格式,其中w是表示日期的宽度,注意:这个宽度不能超过32
格式 | 范围 | 示例 | 输入格式 |
YYMMDDw. | 6~32 | 20191208 | YYMMDD8. |
2019/12/08 | YYMMDD10. | ||
MMDDYYw. | 6~32 | 120819 | MMDDYY6. |
12082019 | MMDDYY8. | ||
DDMMYYw. | 6~32 | 081219 | DDMMYY6. |
08122019 | DDMMYY8. | ||
DATEw. | 7~32 | 08DEC19 | DATE7. |
08DEC2019 | DATE9. | ||
MONYY7. | 5~32 | DEC19 | MONYY5. |
DEC2019 | MONYY7. |
补充:特殊输入符: ":" 和 "&"
1.冒号(:)的作用
先看下面的例子
这个结果怎么跟我想象中的不太一样,在SAS程序中,默认情况下:每个变量之间,不是有空格隔开了吗?我这也隔开了,怎么显示的数据这样?
曰:SAS的默认,是默认不指定宽度,如果你指定了宽度,那么SAS就再也不是以默认的空格作为变量区分的标志了,而是按照指定的宽度来识别变量,例如:你对city这个变量指定了18,那么程序就会从头开始读取,直到18位结束才认为city的值,不管中间读到了什么,它都认为是city的值。这个时候冒号的作用就出来了,你在变量和输入格式之间加一个冒号,这个冒号就会告诉SAS,读取下一个变量,要么遇到空格,要么变量的宽度读完了,现在咱们再改一下这个程序,看看结果
2.&的作用
请先看一个示例:
友友们,可以看一下,如果咱们的数据有空格怎么办?在SAS程序中,一般空格时默认隔开的,但是实际的数据中,我们又想让它显示空格,这个时候,咱们需要&符号来救场,&符号可以处理空格,并且两个变量之间,必须用双空格,因为变量中有空格,所以现在一个空格无法识别是变量中的,还是默认分割符,所以这个时候需要用2个空格来作为默认分隔符,否则,可能会出现意想不到的结果,如果你想见识,可以多尝试一下,看看结果。
OK,到这一步,已经把输入格式化梳理完了,其实,简单来说,输入格式化,就是让SAS程序来按照这种格式去读数据,现在我们说一下输出格式化,输出嘛,非常简单,就是展示给别人看的。
SAS变量的输出格式化
输出格式使用format语句来定义的.在input format 变量1 格式1 变量2 格式2 ...
数值型的输出格式
数值型的输出格式有很多,其实,大体可分为三种:w.d、commaw.d和percentw.d
w.d的含义与输入格式中的w.d一样,commaw.d的作用是将数字的整数部分自右向左 每三位用逗号隔开,就是excel表格中千分位展示的那种类型。percentw.d的作用是将数据显示百分比的形式,它自动将变量乘以100,并加上%,看下面的一个示例:
由以上解释:
整型:sqnum这个是整型,宽度是5,实际数据都是3,所以都能完全展示
千分位:amt 宽度是7,小数点1位,千分位展示,可以看10000和15000,在amt中,数字加小数点的位数都已经7位了,所以千分位的逗号都没有展示出来,9000,长度短,所以千分位展示,可以比对amt1,所以如果要设定千分位展示时,想要把逗号都展示出来,必须考虑逗号,否则,可能还是按照原格式展示的
百分号:在rate的结果中,可以看出,%占了3个字节,长度不够时,会舍去数字,它跟千分位commaw.d不一样,千分位长度不够时,会舍去逗号,这两个要注意。
字符型输出格式
对于字符串变量来说,只要把变量正确的读取进来,则会一模一样的显示出来,所以在字符型中,无须设定输出格式。如果不设定的话,SAS的默认字符串长度是8.
日期型输出格式
日期型的输出格式和输入格式是一样的,不过输出格式可以在宽度值前面家伙是哪个一个字母,以区分各种显示形式。如下图所示:
字母 | 输出格式 | 显示 |
s(/) | YYMMDDs8. | 19/12/08 |
d(-) | YYMMDDd8. | 19-12-08 |
p(.) | YYMMDDp8. | 19.12.08 |
c(:) | YYMMDDc8. | 19:12:08 |
b(空格) | YYMMDDb8. | 19 12 08 |
n(无) | YYMMDDn8. | 20191208 |
总结:
在了解到输入格式和输出格式之后,有人会说,这两者在展示上,是一样的,那它们是不是一样的?在这里,我想说:它们实际上是不一样的,输入格式会改变变量的本身值,但是输出不会改变变量本身的值。请看下面的示例:
x设定了输出格式,长度是2,所以展示是2,但是它实际值不变,让它赋给c,所以c的值是zxy, 而y设定了输入格式,长度2,所以展示y的时候,输出也是2,把它赋给d,所以d也是2,即zx