1、纵向合并
SAS纵向合并的语句是SET语句,语法格式如下:
DATA 数据集;
SET 数据集1(数据集选项)数据集2(数据集选项)…;
RUN;
SET语句作用是将若干个数据集依次纵向连接,并存放语法建立的数据集中。如果SET4语句后面只有一个数据集,此时相当于复制作用,即将SET指定的数据集中的数据复制到DATA语句建立的数据集中。
数据集选项最常用的2种:
SET 数据集1 (IN=临时变量1)数据集2(IN=临时变量2)…;
定义临时变量1,当数据来自数据集1时,变量的值为1否则为0;
SET数据集1(RENAME=(原名1=新名1…))数据集2(RENAME=(原名1=新名1…))…;
例1:
/* 创建纵向合并用的数据集 */
DATA Day04.ds1;
INPUT id name $ gender age weight height;
CARDS;
1 Jack 1 16 67 170
2 Rose 2 18 60 155
3 Timo 1 26 70 181
4 John 2 20 66 176
;
RUN;
DATA Day04.ds2;
INPUT id name $ gender age weight height;
CARDS;
5 张三 1 21 62 172
5 李四 2 23 69 159
7 王五 1 16 70 161
;
RUN;
DATA Day04.ds3;
INPUT id name $ gender age wt ht;
CARDS;
8 赵六 1 21 62 172
9 刘八 2 23 69 159
10 孙七 1 16 70 161
;
RUN;
PROC PRINT DATA=Day04.ds1; /* 显示第1个数据集 */
RUN;
PROC PRINT DATA=Day04.ds2; /* 显示第2个数据集 */
RUN;
PROC PRINT DATA=Day04.ds3; /* 显示第3个数据集 */
RUN;
进行纵向合并(IN)
/* 纵向合并数据 */
DATA Day04.ds;
SET Day04.ds1(IN=a) Day04.ds2(IN=b);/*临时变量不会自己写入数据集;*/
ds1 = a;
ds2 = b;
*使用IN=的方式来追溯数据来源;
RUN;
PROC PRINT;
RUN;
进行纵向合并(名称不一致)
/* 纵向合并数据 */
DATA Day04.ds;
SET Day04.ds1 Day04.ds3;
RUN;
PROC PRINT;
RUN;
利用RENAME处理名称不一致
/* 纵向合并数据 */
DATA Day04.ds;
SET Day04.ds1 Day04.ds3(RENAME=(wt = weight ht = height));
/* 使用RENAME来完成变量的重命名 */
RUN;
PROC PRINT;
RUN;
例:复制数据集
/* 复制数据集ds */
DATA Day04.dsfz;
SET Day04.ds;
RUN;
PROC PRINT;
RUN;
2、横向合并
SAS横向合并的语句是MERGE语句,语法格式如下:
DATA 数据集;
MERGE数据集1 数据集2…;
BY 变量1 变量2…;
RUN;
MERGE作用相当于将若干个数据集依次向右连接,并存放到一个新的数据集中。BY语句相当于指定索引,按索引变量匹配。
SAS中排序的方法是调用PROC SORT过程,语法格式如下:
PROC SORT DATA=要排序的原始数据集 OUT=排序好的新数据集;
BY 变量名称;
例:id顺序一致时
/* 创建横向合并用的数据集 */
DATA Day04.dsm1;
INPUT id chinese math english music;
CARDS;
1 88 91 87 77
2 73 67 99 82
3 98 96 97 92
4 100 98 97 99
5 98 97 85 76
6 66 87 72 90
;
RUN;
PROC PRINT;
RUN;
横向合并:
/* 横向合并数据 */
DATA Day04.dsmerge;
MERGE Day04.ds Day04.dsm1;
BY id;
*在进行横向合并的时候用来作为索引的变量需要有相同的顺序;
PROC PRINT;
RUN;
例:id顺序不一致时
/* 创建横向合并用的数据集 */
DATA Day04.dsm1;
INPUT id chinese math english music;
CARDS;
6 88 91 87 77
5 73 67 99 82
4 98 96 97 92
3 100 98 97 99
2 98 97 85 76
1 66 87 72 90
;
RUN;
PROC PRINT;
RUN;
合并:
DATA Day04.dsmerge;
MERGE Day04.ds Day04.dsm1;
BY id;
PROC PRINT;
RUN;
出现错误:ERROR: 在数据集 DAY04.DSM1 中没有正确排序 BY 变量
结果也错误:
处理方法:先作排序操作
/* 横向合并数据 */
PROC SORT DATA=Day04.dsm1;/* 先进行排序操作 */
BY id;
DATA Day04.dsmerge;
MERGE Day04.ds Day04.dsm1;
BY id;
*在进行横向合并的时候用来作为索引的变量需要有相同的顺序;
PROC PRINT;
RUN;
3、数据对比
SAS中对比两个数据集的命令是PROC COMPARE,语法格式如下:
PROC COMPARE (BASE=数据集COMPARE=数据集)(NOSUMMARY)(TRANSPOSE);
BY变量1 变量2…;
ID 变量1 变量2…;
RUN;
其中()中内容可选。
PROC COMPARE语句调用数据比较过程,选项BASE和COMPARE分别指定两个比较和被比较的数据集;
NOSUMMMARY的作用是不显示一些概括性的结果(例如比较介绍);
TRANSPOSE是按记录显示不一致的结果,如果不指定该选项,默认按变量显示不一致的结果。
BY语句跟MERGE合并中的BY语句作用相同,ID语句通常指定索引变量,如ID号,它可以让你很方便地根据该变量找到相应的观测。
例:
DATA Day04.ab;
SET Day04.ds1;
RUN;
DATA Day04.cd;
SET Day04.ds1;
IF id=2 THEN weight = 100;
RUN;
PROC PRINT DATA=Day04.ab;
RUN;
PROC PRINT DATA=Day04.cd;
RUN;
PROC COMPARE BASE=Day04.ab COMPARE=Day04.cd NOSUMMARY TRANSPOSE;
BY id;
ID id;
RUN;
4、查找/去除重复数据
SAS中用PROC SORT 来查找重复数据,基本格式如下:
PROC SORT (DATA=数据集)(OUT=数据集)(NOUNIQUEKEY)(NODUPKEY);
BY(DESCENDING)变量1(DESCENDING)变量2…;
RUN;
(NOUNIQUEKEY的作用是留下BY变量相同的值,去除BY后面变量值唯一的值(即留下重复记录值,此处的重复是指BY后面所跟变量的重复)
NODUPKEY删除重复的BY变量记录,发生在排序中,SORT过程读取输入数据集中的记录,在写入数据集时先比较BY变量值,如有重复则不写入输出数据集。
例1:
/* 创建用来进行查重的数据集 */
DATA Day04.ef;
SET Day04.ds1;
IF name = 'Jack' THEN name = 'Timo';
RUN;
PROC PRINT;
RUN;
/* 数据集的查重,保留重复记录 */
PROC SORT DATA = Day04.ef NOUNIQUEKEY OUT=Day04.ef2;
BY name;
RUN;
PROC PRINT DATA = Day04.ef2;
RUN;
/* 数据集的查重,保留不重复记录 */
PROC SORT DATA = Day04.ef NODUPKEY OUT=Day04.ef3;
BY name;
RUN;
PROC SORT DATA = Day04.ef3;
BY id;
RUN;
PROC PRINT DATA = Day04.ef3;
RUN;
5、数据的筛选
通过选择较少数量的变量或较少数量的观测值或同时选择较少数量的观测值来提取数据集的一部分。通过使用KEEP和DROP语句完成变量的筛选,使用DELETE语句完成观察的筛选。此外来自筛选操作的结果数据保存在可用于进一步分析的新数据集中。筛选主要用于分析数据集中的一部分而不使用那些可能与分析不相关的变量或观察的目的。
SAS利用KEEP/DROP语句实现变量的筛选,基本格式如下:
KEEP VAR1 VAR2…;
DROP VAR1 VAR2…;
其中VAR1,VAR2是数据集需要进行保留或删除的变量名。
例:用KEEP从原有的dsmerge中保留保留获得gh
/* 筛选变量 */
PROC PRINT DATA=Day04.dsmerge;
RUN;
DATA Day04.gh;
SET Day04.dsmerge;
KEEP id name gender age;
KEEP id name gender chinese math;
/* KEEP用来设置要保留的字段,DROP用来设置要删除的字段*/
/* DROP age height weight english ; */
RUN;
PROC PRINT DATA=day04.gh;
RUN;
对观测进行筛选
基本语法如下:
IF var condition THEN DELETE;
参数说明:var是变量名称,根据它的值,将使用指定的条件删除观察值。
例:用DELETE从原有的dsmerge中筛选身高超过170的人。
/* 对观察进行筛选 */
PROC PRINT DATA=Day04.dsmerge;
TITLE '原始数据集';
RUN;
DATA Day04.gh2;
SET Day04.dsmerge;
IF height<170 THEN DELETE;
/* IF height>=170 THEN OUTPUT; */
/*DELETE和OUTPUT是相反的操作,前者是删除满足条件的记录,后者是输出满足条件的记录 */
RUN;
PROC PRINT DATA=Day04.gh2;
TITLE '筛选后的数据集';
RUN;