SAS操作知识点记录

 

2018年11月11日 06:26:58 wangpc777 阅读数:14 标签: SAS 更多

个人分类: SAS

SAS数据集
sas数据集是由sas创建并且处理的文件

浏览描述部分
contents过程可以显示sas数据集的描述部分

procproc contents DATA=SAS-data-set +变量名;
run;

SAS逻辑库
SAS逻辑库就是SAS文件的集合。
如果将SAS逻辑库看成是文件柜中的一个抽屉,那么一个SAS数据集就是抽屉中众多文件夹之一。

逻辑库引用名(libref)
work是SAS的临时库,如果我们直接创建data数据集,而没有写libref时,默认的是创建了一个临时数据集,此时对应的逻辑库就是Work逻辑库;
SAS中也有永久库,叫做sasuser,当然我们也可以创建自己的逻辑库,

LIBNAME libref “SAS-data-library”
1
libname orion “s:\workshop”;
1
其中orion是逻辑库名,”s:\workshop”是指SAS数据库中物理位置。

在这个我们自己创建的逻辑库中,每个SAS文件有一个二级名称。

数据集orion.sales是orion逻辑库的一个SAS文件
第一级名称:libref指引到逻辑库中;
第二级名称:指引到逻辑库中的文件;

SAS注释
/* comment */

*comment
1
2
3
SAS变量值
变量值的类型:分为数值型变量和字符型变量

缺失值:字符型缺失值显示为空格,数值型缺失值显示为句点

浏览数据部分
proc print data=数据集名称 +需要浏览的变量;
run;
1
2
浏览数据部分和浏览描述部分是不一样的,注意区分开开

PROC PRINT DATA=SAS-data-set NOOBS;
VAR variable(s);
RUN;
1
2
3
NOOBS选项去掉了报告左侧的观测数列,即obs一列
Var语句选择报告中显示的变量及顺序。

默认情况下,proc print 显示以下内容:
所有观测,所有变量和左侧增加的类似于一个编号类的Obs一列,叫做观测类吧,我猜

读取数据集
内容大纲
读入数据简介
SAS数据集加工
读入Excel工作表
读取带分隔符的原始数据文件
访问关系型数据库

这一节内容的话是我们处理数据的第一步,也就是接触数据的部分,我们的数据来源在这里分成了三种情况,第一种是本来就是SAS数据集,第二种是excel数据,第三种是带分隔符的原始数据,也就是csv数据。

读入SAS数据集
LIBNAME libref ‘SAS-data-library’;
DATA output-SAS-data-set;
SET input-SAS-data-set;
WHERE where-expression;
KEEP variable-list;
LABEL variable = ‘label’
variable = ‘label’
variable = ‘label’;
FORMAT variable(s) format;
RUN;
1
2
3
4
5
6
7
8
9
10
data work.subset1;
set orion.sales;
where Country=‘AU’ and
Job_Title contains ‘Rep’;
keep First_Name Last_Name Salary
Job_Title Hire_Date;
label Job_Title=‘Sales Title’
Hire_Date=‘Date Hired’;
format Salary commax8. Hire_Date ddmmyy10.;
run
1
2
3
4
5
6
7
8
9
10
下面就讲解这段代码,首先解释几个语句。

libname
这是我们之前就提到的逻辑库的概念,也就是你的文件夹的名字,你的数据是放在哪个文件夹中的。
如果正在读入或者创建一个永久数据集,则需要分配逻辑库的引用名(libref)

libname orion ‘s:\workshop’;
1
2
这里是读入SAS数据集。

这里的orion是逻辑库名,
‘s:\workshop’;是SAS数据库的物理位置。

libname orionxls ‘s:\workshop\sales.xls’;
1
这里的orionxls是逻辑库名,

’s:\workshop\sales.xls’;是指excel工作表的物理文件名,包括路径、文件名和扩展名。

data
data数据集呢是你创建的要放入SAS中的数据集,也就是你要把读入的数据放到哪个数据集中。

问题:要输出到过程步的数据集和你最终要输出的数据集之间有什么关系?

也就是你要输出到过程步的数据集

DATA output-SAS-data-set
1
可以看出data是创建的一个要输出的数据集。

data后面加上的是你数据集的名称。比如说上面这段代码就是说那你创建了一个名叫work.subset1的数据集。

where
where放在data数据步中呢,主要作用是

set
set这个语句呢就是把你外部的数据读入到你创建的data数据集中,set orion.sales是说你把orion.sales这个外部的数据读入到你创建的data数据中的命令,并在data步中进一步处理

SET input-SAS-data-set;
1
由上述可以set是读入数据集的操作。默认的情况下是读入所有的观测和变量,set语句能读入临时或永久数据集。

当然我们也可以选择要读入的数据种类,所以可以在data步中加入语句,来减少观测和变量的个数。

(where、keep 、drop、label、format、)

libname orion ‘s:\workshop’;
data work.subset1;
set orion.sales;
run;
1
2
3
4
这个是指从一个命名为 orion.sales的永久SAS数据集中创建一个命名为Work.subset1的临时SAS数据集。

接着介绍在data步中可以添加的语句
where
一般表达形式:

WHERE where-表达式 ;
1
比较运算符
算数运算符
逻辑运算符

特殊where运算符:

contains是包含子串
like是比较
区分这两个

选择变量的语句:drop和keep语句
drop语句是指定输出数据集中药删除的变量名称(这里是指在输出集中删除而已,原始数据中是没有改变的)

DROP variable-list;
1
keep语句是制定要写入的数据集的变量名称

KEEP variable-list;
1
keep First_Name Last_Name
Salary Job_Title
Hire_Date;
1
2
3
问题:读取带分隔符的原始数据文件用的语句是input,之前的语句是set,所以说有格式的文件读入的时候就不能用set了吧,只有非常标准的文件才能用set 读入

添加永久属性:label和format
SAS数据集的描述部分存储包含名称、类型(字符或数值)和变量长度的变量属性。(这三个属性是固有的必须有的意思)

label

label语句将描述标签赋给变量名

label Job_Title=‘Sales Title’
Hire_Date=‘Date Hired’;
1
2
这里是指在输入数据集中的Job_Title添加标签为’Sales Title’
Hire_Date添加标签为’Date Hired’

在一个data步中使用label语句,通过标签存储在这个sas数据集的描述部分,使标签和变量永久关联

PS:如果想要标签展示在输出的数据集中,则需要在proc print +数据集 后面加上label这个语句。

format

format语句将格式赋给变量值

FORMAT variable(s) format;
1
格式是SAS用于写出数据的一个指令。

在data步中使用format语句,通过将格式存储在SAS数据集的描述部分中,使格式和变量永久关联。

特别要注意的是数值型格式和日期型格式。

format Salary commax8. Hire_Date ddmmyy10.
1
这里指出salary变量的格式为commax8.以及Hire_Date变量的格式是ddmmyy10.

PS:

除了Zw.d 用0代替空格来填补右对齐的输出, Zw.d 格式
与w.d 格式相似。

标签和格式也能存储在描述符部分

set语句是从一个SAS数据集中读入观测,并在DATA步中进一步处理
input语句描述了原始数据文件中的数值排列,同时将输入值赋值给相应的sas文件,

SAS中的输出是一条一条输出呢还是一次性输出呢?

读取Excel数据
SAS/ACCESS LIBNAME语句 扩展了LIBNAME语句,将一
个逻辑库名(libref)分配给 Microsoft Excel工作表

libname orionxls ‘s:\workshop\sales.xls’;
1
这个语句使你能在一个DATA步或SAS程序中直接引用工作
表,读取和写入到一个Microsoft Excel工作表,就像它是
一个SAS数据集。

excel工作簿中的每个工作表被当做一个SAS数据集

libname orionxls ‘s:\workshop\sales.xls’;
data work.subset2;
set orionxls.'Australia$'n;
where Job_Title contains ‘Rep’;
keep First_Name Last_Name Salary
Job_Title Hire_Date;
label Job_Title=‘Sales Title’
Hire_Date=‘Date Hired’;
format Salary comma10. Hire_Date weekdate.;
run;
1
2
3
4
5
6
7
8
9
10
如果SAS将逻辑库名分配给一个Excel工作表,这个工作表将不能在excel中打开,要取消逻辑库,用libname语句并指定库名和clear选项。

libname orionxls clear;
1
从SAS数据集中创建Excel工作表:data或者copy
data

libname orionxls
‘s:\workshop\qtr2007a.xls’;
data orionxls.qtr1_2007;
set orion.qtr1_2007;
run;
1
2
3
4
5
用copy创建excel表

libname orionxls
‘s:\workshop\qtr2007b.xls’;
proc copy in=orion out=orionxls;
select qtr1_2007 qtr2_2007;
run;
proc contents data=orionxls.all;
run;
libname orionxls clear;
1
2
3
4
5
6
7
8
注意在input读入的格式部分的处理以及format部分的格式处理。(这两者有区别吗??)

PS:注意where语句不能用于从一个原始数据文件中选择记录,只能用于从输入数据集中选择部分观测。

用import向导和程序读入一个excel表,export向导和程序创建一个excel表
读取带分隔符的原始数据(是不是就是csv数据呀)
这一节主要讲如何读取带分隔符的原始数据,那个带分隔符的原始数据又分为两种,一种是读取带分隔符的标准数据;一种是读取带分隔符的非标准数据,下面我们来看看这两种之前又什么区别和联系

区分标准数据和非标准数据

读取带分隔符的标准数据
DATA output-SAS-data-set;
LENGTH variable(s) $ length;
INFILE ‘raw-data-file-name’;
INPUT specifications;
KEEP variable-list;
LABEL variable = ‘label’
variable = ‘label’
variable = ‘label’;
FORMAT variable(s) format;
RUN;
1
2
3
4
5
6
7
8
9
10
infile
infile语句用来定义原始数据文件的物理名称,以便于用input语句读入。(物理名称是指操作系统环境用于访问这个文件的名称,那我还是不懂啊,这个名称是具体到某个盘的某个文件夹下的名称吗)

infile ‘s:\workshop\sales.csv’;
1
input
input语句描述了原始数据文件中的数值排列,同时将输入值付给相应的sas变量

DATA output-SAS-data-set;
INFILE ‘raw-data-file-name’;
INPUT specifications;

RUN;
1
2
3
4
5
这里要写一个input语句和set语句的区别,还有一个问题,上文读入的excel语句是外部语句把

分隔符
一个空格(空白)是默认的分隔符,如果想指定其他的分隔符,则用DLM=选项 来进行指定

DATA output-SAS-data-set;
INFILE ‘raw-data-file-name’ DLM=‘delimiter’;
INPUT specifications;

RUN;
1
2
3
4
5
标准数据的列表输入
INPUT variable <$>;
1
2
变量一定要按照它们在原始数据文件中出现的顺序从左到有依次排列。

data work.subset3;
infile ‘sales.csv’ dlm=’,’;
input Employee_ID First_Name $ Last_Name $
Gender $ Salary Job_Title $ Country $;
run;
1
2
3
4
5
非标准数据的列表输入
列表输入的格式如下:

INPUT variable <$> variable < :informat >;
1
:修饰符使你可以用一个输入格式读入带分隔符的非标准数据

input Employee_ID First_Name $ Last_Name $
Gender $ Salary Job_Title $ Country $
Birth_Date :date.
Hire_Date :mmddyy.;
1
2
3
4
额外的SAS语句
这个额外的sas语句包括where /keep/drop/format
其实就和读入sas数据集的处理部分相似了

data work.subset3;
length First_Name $ 12 Last_Name $ 18
Gender $ 1 Job_Title $ 25
Country $ 2;
infile ‘sales.csv’ dlm=’,’;
input Employee_ID First_Name $ Last_Name $
Gender $ Salary Job_Title $ Country $
Birth_Date :date.
Hire_Date :mmddyy.;
keep First_Name Last_Name Salary
Job_Title Hire_Date;
label Job_Title=‘Sales Title’
Hire_Date=‘Date Hired’;
format Salary dollar12. Hire_Date monyy7.;
run;



####记录缺失值
用连个连续的分隔符知名缺失值
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
data contacts; 
length Name 20PhoneMobile20PhoneMobile 14; 
infile ‘phone2.csv’ dlm=’,’; 
input Name PhonePhone Mobile $; 
run; 
proc print data=contacts noobs; 
run;



####DSD选项
infile语句中的dsd选项:
设置默认分隔符为逗号
将连续分隔符视为缺失值
可读入在引号内包含分隔符的数据值

1
2
3
4
5
6
7
8
9
data contacts; 
length Name 20PhoneMobile20PhoneMobile 14; 
infile ‘phone2.csv’ dsd; 
input Name PhonePhone Mobile $; 
run; 
proc print data=contacts noobs; 
run; 
“` 
DLM=‘,’ 选项在INFILE语句中不再需要,因为DSD选 
项设置默认分隔符为一个逗号。

@和@@的区别
data
DATA 语句 表示一个数据步的开始,并给出正被创建的 
SAS数据集的名字。

set
SET 语句 从一个SAS数据集中读入观测,并在DATA步中 
进一步处理。

选择观测和变量
默认情况下, SET语句从输入数据集中读取所有的观测和 
变量。 
通过添加语句到DATA步,可以减少观测和变量的个数。

一个变量运算数必须是来自输入数据集的一个变量。
--------------------- 
作者:wanting1511181498 
来源:CSDN 
原文:https://blog.csdn.net/wanting1511181498/article/details/78259730 
版权声明:本文为博主原创文章,转载请附上博文链接!

猜你喜欢

转载自blog.csdn.net/mym217217/article/details/84070141