特别说明:本节【SAS Says】基础篇:复制、堆叠、合并数据,用的是数说君学习《The little SAS book》时的中文笔记,我们认为这是打基础的最好选择。
前面我们介绍过导入数据、ODS的使用、产生一个描述性结果的报告。到这一节,终于开始玩数据了。本节就开始复制和合并数据。
本节目录:
1. 使用SET语句复制数据集
2. 使用SET语句堆叠数据
3. 使用SET语句插入数据集
4. 一对一匹配合并数据
5. 一对多匹配合并数据
6. 合并统计量与原始数据
7. 合并total和原始数据
【SAS Says】基础篇:复制、堆叠、合并数据
1. 使用SET语句复制数据集
SET语句可以复制数据集。基本形式为:
DATA new-data-set;
SET data-set;
Data语句指定了新数据集名,set指定要读取的老数据集名。如果不想创建新的,则也可以在data中指定老数据集。
下面的代码创建了一个Friday的新数据集,将sales数据集中的day属于Friday的观测值复制,并创建了新变量total:
例子 有一份关于火车运汽车的数据,汽车主为了在高峰期节省时间,或者为了节省汽油,选择让火车运汽车的方法,变量依次为:
一天中发车的时间、火车上的汽车数、火车中的人数:
数据被读入一个永久数据集trains中,储存在MYSASLIB目录文件夹下:
由于每辆车的最大乘客数为6人,现在想知道一列火车上,平均每两汽车的乘客数是多少,可以在数据中插入一列,但这不在原始数据中计算,而是在一个新数据集中计算:
结果如下:
2. 使用set语句堆叠数据
运用set语句可以把一个数据集堆在另一个数据集上,如上图所示,适用于两个变量相同的两个数据集。基本形式为:
DATA new-data-set;
SET data-set-1 data-set-n;
首先指定一个新的数据集,然后列出需要合并的旧数据集。
如果一个数据集包含了另一个数据集没有的变量,那么合并后,该变量下将会出现缺失值。
例子有如下两份南北数据,北方数据比南方多了一行变量(最后一行),其他变量均相同:
下面有三段代码,前两段将南方和北方的数据各输入数据集,并打印。第三段使用SET语句将南北方数据合并,并创建了新变量,AmountPaid:
输出结果如下:
3. 使用SET语句插入数据集
前面的堆叠数据,可能把数据顺序打乱,当然可以再用proc sort再将数据排序。但这可能效率低下。在set语句中使用by语句可以高效率的将数据按顺序合并,基本形式为:
DATA new-data-set;
SET data-set-1 data-set-n;
BY variable-list;
BY语句中,可以指定一个或多个变量,让SAS进行排序。
注意,在合并几个数据之前,每个数据都要用BY进行排序,如果没有,则要用proc sort完成。
例子 仍然是刚才的例子:
注意南方的数据已经按照pass number(第二个变量)进行了排序,北方的没有。下面还是三段代码,第一段对南方的数据输入,打印。第二段对北方的数据输入、排序、打印。第三段进行合并,并创建新变量INTERLEAVE。
下面是输出结果:
4. 一对一匹配合并数据集
横向合并数据集:
(1)首先一定要排序!使用sort过程按照匹配变量排序。
(2)之后在data语句中对新SAS数据集命名。
(3)再使用merge语句列出要合并的数据集名。使用BY语句说明共同变量。
DATA new-data-set;
MERGE data-set-1 data-set-2;
BY variable-list;
注意,如果两个数据集有重叠的变量——除了BY变量,那么第二个数据集中的此变量会覆盖第一个数据集中的。
例子 有一个巧克力店记录了每天所卖巧克力的类型以及数量,第一个文件sales data记录了所卖的巧克力代码和数量,第二个记录了巧克力代码、所代表的类型、描述。
下面有三段代码:
前两段读取sales数据,description数据。
后者已经对codenum变量进行排序,前者需要用proc sort进行排序。否则会出现错误的信息:ERROR:BY variables are
not properly sorted
结果如下:
注意K086的销售记录缺失,因为sales data中没有关于其的记录。
5. 一对多匹配合并数据
一对多合并是指一个数据集中的一个观测值可以与另一个数据集中的多个观测值匹配。基本形式与一对一一样:
DATA new-data-set;
MERGE data-set-1 data-set-2;
BY variable-list;
注意数据集的顺序,一对多的一要放在前面。在进行合并之前,仍然要对两个数据集按照匹配变量进行排序。其他注意与6.4差不多。
例子 有一份关于鞋子打折的数据,其中训练鞋、跑步鞋、走路鞋的折扣各不同。第一份数据是关于鞋子的风格、类型、价格。第二份数据是关于每个类型鞋子的折扣:
下面的代码用多对一合并了两个数据:
结果如下:
6. 合并统计量与原始数据
当你想比较每一个观测值和一组变量的均值时,可以先使用proc means计算统计量,并保存输出文件,再与原始文件合并。
例子 有一份关于鞋子销量的数据,变量为鞋子风格、类型、销量。现在想列出每种类型鞋子里,各风格的销售量所占的百分比:
代码:
描述统计量的结果summarydata如下:
合并后的数据如下:
7. 合并total和原始数据
可以通过means过程创建一个包含总计(不是分组总计)的数据集。但不能直接与原始数据合并,因为没有匹配变量。幸运的是,可以用两个set语句:
DATA new-data-set;
IF_N_=1 THEN SET summary-data-set;
SET original-data-set;
原始数据包含了不止一个观测值,而summary数据集只有一个观测值。只在数据步的第一次迭代中,SAS读取了summary数据集,之后为新数据的所有变量记住这个变量值。
它的工作原理在于SET语句是自动记住的。往常之中,记住的变量会被下一个观测值改写,但这里变量只在第一次迭代的时候读取,并为所有观测值记住,这一技术适用于没有匹配变量的情况下,将一个单个观测值合并到多个观测值中。
例子 与上节同样的例子,现在想看每种类型的鞋子销量占总销量的百分比:
代码为:
输出结果为: