SAS学习笔记(二)

本次课主要总结以下语句的使用:

DATA
INPUT
DATALINES(CARDS)和DATALINES4
LENGTH
LABEL
LOSTCARD
INFORMAT/FORMAT
MISSING
OPTIONS

1、data

格式:DATA <数据集名> <选项>
常用选项:label=为数据集提供标记;DROP=列出不包括在数据集中的变量
缺省逻辑库为WORK,临时逻辑库,当关闭软件,这个逻辑库的数据集会消失
同一次会话过程中,可以有多个DATA语句创建多个数据集。最后建立的为当前数据集
如果分析工作不需要建立数据集,DATA语句中的数据集名可以用_NULL_

示例1:

DATA student;
INPUT num $ name $ sex $;
DATALINES;/*定义内置数据,功能与cards相同
060101 zhangsan f
060102 liling m
060201 liufeng f
DATA score;
INPUT num $ phy math engl;
DATALINES;
060101 89 90 77
060102 92 70 88
060201 80 84 75
PROC PRINT;/*这里有两个数据集,没有指出输出哪个数据集,则会输出最后一次建立的数据集
/* PROC PRINT DATA=student; */要指定具体数据集名称才会输出相应的数据集,输出student数据集
RUN;

示例2:空数据集,不会再硬盘建立数据集,只是为了输出a这个变量

data _null_;
a=sin(3.14159/4);
put a ; /*显示a的值*/
run;

示例3:

LIBNAME ep 'e:\saslx' ;/*把数据输出到本地就可以永久使用
DATA ep.students;
INPUT num $ name $ sex $ h w ;
DATALINES;
020801 ZHANGLING F 1.56 47.1
020802 ZHAOHUA M 1.72 61.5
030813 WANGQANG M 1.69 64.5
030824 LIULI F 1.58 53.6
030815 SHIDONG F 1.60 48.0
;
PROC PRINT;
RUN;
建立永久数据集以后,下次可以直接调用
LIBNAME ep 'e:\saslx' ;
PROC PRINT DATA=ep1.students;/*调用本地的数据集

2、input

(1)列表输入

用于描述输入的数据。从外部文件或紧跟的CRADS读入数据,赋给该语句列出的各个变量。
格式:INPUT <数据项描述>……
一般认为读入的数据是数值型,除非:1 变量名后有$号;2 使用字符的输入格式表示;3 变量事先被定义成字符型
数据中的缺项值用“.”表示。如果读入数据与数据类型不匹配,则按无效数据置为缺项值。

(2)格式化输入

格式:INPUT 变量名 <修饰符> 输入格式……;
输入格式例子:INPUT name $10. birthday mmddyy10. weight 4.1;(解释)/*表示变量有10位的长度,这个变量有4个字符那么宽,点1表示一个小数位)

数据中的年月日之间应用特殊符号或空格隔开。格式化输入时,数据项不再以空格作为结束标志,而是由读指针按给出的格式长度移动,依次读数据项。数据前后的空格也要计算在内。

(3)格式列表

INPUT (score1-score5) (4. 4. 4. 4. 4.);/*输入5个变量,分别是score1-score5,每个变量的长度都是4
INPUT (score1-score5) (4.);
INPUT (name core1-score5) ($10. 5*4.);

(4)格式修饰符

“:”修饰符。表示从下一个非空格列读入数据,直到:1 遇到再下一个空格列;2 读到预先定义的变量长度;3 数据行结束。哪个先出现就在哪结束
“ &”修饰符。表示从下一个非空格列读入数据,直到:1 遇到连续的两个空格;2 在DATA步中定义的最初的变量长度;3 输入行结束。哪个先出现就在哪结束
DATA ONE;
INPUT NAME & $12. SEX $ AGE;/* &符号解决名字读取时,名字之间有空格,避免出现只把名字的某个字作为变量的情况,前面的格式列表是以空格分割变量的。
DATALINES;
Li Li F 19
Wang Da Zhi M 20
PROC PRINT;
RUN;

(5)指针控制

列指针
绝对指针控制:数值型(指出位置)、字符型(指出要匹配的字符串)
相对指针控制

行指针


以下为绝对指针控制:

数值型指针
@n:INPUT @15 sales 5.;/*从绝对位置15开始读sale,sales长度为5
@指针变量:A=25; INPUT num 1-6 @A num $ 10.;
@表达式:
DATA ONE;
B=2;
INPUT @(B*3) GRADE @1 A 3.;/*从位置6开始,GRADE读取为67,A从第一个位置开始读三个长度的数据,读取为123
DATALINES;
1234567 343454
;
proc print;
run;

字符型指针
三种形式:@’字符串’,@字符变量,@字符表达式
DATA ONE;
INPUT @'size=' A 3.;/* 在输入的数据中找到size这个字符串,从'size='后面的第一个数据开始读,读取3个长度,则A读取为343
DATALINES;
Li Li F19size=343454
Wang Da Zhi M 20size=123456
PROC PRINT;
RUN;

以下为相对指针控制

三种形式:+n,+指针变量,+表达式,意指把指针从当前位置移过规定的列数/*n可正可负,如果为正表示从当前位置向前移动n个长度,为负则向后移动n个长度
负数表示指针往前移动
例子
INPUT @23 length 4. +5 width;
M=-1; INPUT x 1-10 +M y 2.;/*表示输入x变量,位置为1-10,然后又向左移动一个长度,读取y变量,长度为2
INPUT x 1-10 +(-1) y 2.;

行指针

适用于一个观测值占有多个输入行的情况
4种形式:#n,#指针变量,#表达式,/
INPUT语句中,#号后最大的数字决定每个观测占有多少行
/表示把指针移动到下一输入行的第一列
当每个观测有多个输入行,但不从最后一行读取数据的时候,在INPUT语句末尾必须使用#将指针移到最后一行。
例子
INPUT @31 age 3. #3 id 3-4 #2 @6 name $ 20.;/*第一行,跳到31的位置,读取3个长度得到age值,#3跳到第三行,读取Id,#2 @6跳到第2行从第16个位置开始读取20个长度的字符name
INPUT name $ 1-10 #2 age 13-14 #4;/*表示我要读取的变量占了4行,但是我只需要读取第一第二行的数据
INPUT age grade/score1-score5;/*在第一行读取age grade,再跳到第二行读取score1-score5
INPUT a / b #1 @52 c #2;

行保持符

多个INPUT语句读取同一数据行的数据,使用单尾随符@
一个INPUT语句在一个输入行中读取多个观测,则使用双尾随符@@
例子
DATA b;
INPUT x y @@;/*表示不换行
DATALINES;
3.16 2.9 5.8 3 4.9 4.17
;
PROC PRINT;
RUN;

3、 DATALINES语句/*定义内置数据

相当于CARDS语句
该语句必须是数据步的最后一条语句
MISSOVER处理
DATA TEMP;
INFILE DATALINES MISSOVER;/*因为Input没定义缺失,所以这里定义missover,这样不会删除多于变量的数据列
INPUT X Y Z ;
DATALINES;
1 10 100
2 20
3 30 300
;
PROC PRINT;
RUN;

4、DATALINES4

专用于处理数据里包含分号的情况
数据最后用4个“;”结束
DATA B;
INPUT NUM CITATION & $50.;
DATALINES4;
1 SMITH, 1982
2 ALLEN ET AL., 1975; BRADY, 1983
3 BROWN, 1980; LEWIS,1974; WILLIAMS,1972
;;;;
PROC PRINT;
RUN;

5、LENGTH

用于指出变量的长度(缺省为8)
格式:LENGTH 变量 [$] 长度;
DATA a;
LENGTH name $ 12;
INPUT name sex $ h w;/*也可以直接在变量后指明长度,如INPUT names $ 12 sex $ h w;这样可以省略Length
DATALINES;
ZhangZhihui F 1.71 49
ZhaoChangtai M 1.73 55
;
RUN;

6、label  /*给变量别名

DATA d;
INPUT name $12. sex $ h w;
LABEL h='身高' w='体重';
DATALINES;
ZhangZhihui F 1.71 49
ZhaoChangtai M 1.73 55
;
PROC PRINT LABEL;
run;

7、 LOSTCARD

当一个观测值占有多个输入行时,该语句用于防止丢失输入行后引发的定位错误
通常和IF … THEN … 语句一起使用,IF语句用于指出判定数据行丢失的条件
例子
DATA TEST;
INPUT ID TEST1 #2 IDCHECK TEST2 TEST3;
IF ID NE IDCHECK THEN LOSTCARD; /*NE不等于,判断ID是否等于IDCHECK,,303和304不等,303就会被丢弃,丢弃后,因为LOASTCART的作用,编号会重排
DATALINES;
301 92
301 61 73
302 83
302 88 99
303 92 78
304 85
304 90 94
;
PROC PRINT;
RUN;

8、INFORMAT和FORMAT

INFORMAT语句用来给INPUT指定格式码
FORMAT语句用来给PRINT指定格式码
DATA STUDENT;
INFORMAT birthday mmddyy8.;
INPUT name $ birthday ;  /*还可以直接省略掉
INFORMAT birthday mmddyy8.; ,直接写成INPUT name $ birthday mmddyy8.;
FORMAT birthday WORDDATE.;
DATALINES;
ZhongLi 03-15-89
LiuWei 07/22/85
;
PROC PRINT;
RUN;

9、MISSING

用于指出某些数据缺失的原因
使用一个字母进行MISSING登记,系统遇到MISSING值后,不会按无效数据处理,而是登记到数据集中
DATA surv;
MISSING N R; /*输入数据中遇到N和R,系统不会把他们作为缺失值处理,仍然可以正常输入
INPUT num answer @@;
DATALINES;
1001 2 1002 R 1003 1
1004 N 1005 2
proc print;
RUN;

10、读入txt文件

DATA d1;
INFILE 'E:\sasdt\fit1.txt';
LENGTH name $ 10;
INPUT num $ name sex $ height weight;
proc print;
RUN;

11、读入excel数据

LIBNAME ep 'e:\saslx';
PROC IMPORT OUT= EP.score /*为建永久数据集另加的语句 */
DATAFILE= "E:\SASEX\cjb.xls"
DBMS=xlsx REPLACE;
SHEET="Sheet1";
GETNAMES=YES;
options nodate;
proc print;
RUN;

12、从已有数据集读入数据

SET语句
DATA d3;
SET d1;
RUN;
从已有数据集d1中读入数据,建立新数据集d3




你可能感兴趣的:(SAS)