前言
目前项目进行到中期,最近又学习了一些新的知识,例如sas拼表、导出文件、数据集筛选等,好记性不如烂笔头,记录下来有待后期回头查看,人生总是走在学习的道路上。
SAS 导出文件
SAS将数据集导出为文件有两种方法,一种使用
PROC EXPORT
,另外一种是使用DATA
步
- proc export
PROC EXPORT DATA=DATA_SET OUTFILE="/sas/data_set.txt" DBMS=TAB REPLACE;
DELIMITER="|";
PUTNAMES=NO;
RUN;
/*
DATA:指定要导出的数据集
OUTFILE:指定要导出的文件
DBMS:指定导出文件类型,文本文件为TAB CSV文件为CSV
REPLACE:文件覆盖选项
DELIMITER:指定文件的分隔符
PUTNAMES:指定是否输出表头
*/
- data
FILENAME DATA_SET "/sas/data_set.txt";
DATA _NULL_;
SET DATA_SET;
FILE DATA_SET LRECL=32767 DLM="|" ENCODING="UTF-8" TERMSTR=CRLF;
PUT
NAME AGE CLASS_NAME;
RUN;
/*
LRECL:指定读入记录的长度,默认是256
DLM:指定分割符
ENCODING:指定文件编码
TERMSTR:指定记录分隔符
*/
SAS 数据集筛选
- WHERE子句进行筛选
代码语言:javascript复制SAS 数据集筛选可以在DATA步中进行操作,使用
WHERE
关键字对指定的列的值进行条件筛选,例子如下:
DATA STUDENT;
SET STUDENT;
WHERE AGE <= 10;
RUN;
- KEEP关键字
代码语言:javascript复制KEEP关键字可以使数据集保留下你想要的字段,比如一个表里边有五个字段,你只想保留三个字段,则使用KEEP关键字进行过滤
DATA STUDENT;
SET STUDENT;
KEEP 字段1 字段2 字段3;
RUN;
- DROP关键字
代码语言:javascript复制DROP关键字可以丢掉你不想要的字段
DATA STUDENT;
SET STUDENT;
DROP 字段1 字段2 字段3;
RUN;
- 另外的写法
DATA STUDENT;
SET STUDENT(KEEP=);
RUN;
DATA STUDENT;
SET SUTDENT(DROP=);
RUN;
DATA STUDENT;
SET STUDENT(WHERE=);
RUN;
SAS 分支语句格式
代码语言:javascript复制DATA _NULL_;
IF CONDITION THEN ACTION;
RUN;
DATA _NULL_;
IF CONDITION THEN DO;
ACTION;
ACTION;
ACTION;
END;
RUN;
DATA _NULL_;
IF CONDITION THEN ACTION;
ELSE IF CONDITION THEN ACTION;
ELSE IF CONDITION THEN ACTION;
ELSE IF CONDITION THEN ACTION;
ELSE CONDITION THEN ACTION;
RUN;
SAS 拼表
SAS 拼表过程十分简单,拼表意思就是表A和表B有共同的列,将表根据相同的列拼在一起,跟SQL中的left join和right join还有inner join是一个道理,在拼表之前需要将数据集根据公共的字段排序,需要用到
PROC SORT
,下面介绍一下PROC SORT
- PROC SORT
PROC SORT DATA=STUDENT NODUPKEY DUPOUT=;
BY 字段名1 字段名2 字段名3;
/*PROC SORT 默认会根据第一个字段排序,然后第二个,第三个*/
RUN;
/*
NODUPKEY:关键字可以实现去重功能
DUPOUT=数据集名称:可以实现将重复的数据放在指定的数据集中
BY DESCENDING:默认以升序排序,用了DESCENDING关键字则以降序排序
*/
- MERGE
/*left join*/
DATA STUDENT;
MERGE A(IN=A) B(IN=B);
BY NAME;
IF A;
RUN;
/*right join*/
DATA STUDENT;
MERGE A(IN=A) B(IN=B);
BY NAME;
IF B;
RUN;
/*inner join*/
DATA STUDENT;
MERGE A(IN=A) B(IN=B);
BY NAME;
IF A AND B;
RUN;
/*
MERGE:表A(IN=A) 表B(IN=B)
BY 后面跟两个表共有的主键
IF 后面跟表关联关系
*/