SAS|初入 SAS(二)

书籍:《小白学 SAS》——冯国双编著
章节:第 3 章 SAS 数据清洗和加工
2. SAS 数据清洗和加工

  • 2.1 数据合并
  • 2.2 数据对比
  • 2.3 数据清洗——查找和删除重复值
  • 2.4 数据清洗——查找缺失值
  • 2.5 数据清洗——查找异常值
  • 2.6 缺失值的填补
  • 2.7 产生数据子集
2.1 数据合并 利用 set 语句进行纵向合并:
data 数据集; set 数据集1(数据集选项) 数据集2(数据集选项) ...; run;

  1. set 语句后面如果只加一个数据集,则为复制该数据集。
  2. 【SAS|初入 SAS(二)】数据集选项常用的两个:(in=临时变量1) 可以针对该数据集创建一个临时变量,当数据属于该数据集时,该临时变量值为 1,否则为 0;(rename=(原名 1= 新名 1 …)) 可以将该数据集的变量改变名字。
  3. 使用 contents 可以看数据集变量的属性。
proc contents data=https://www.it610.com/article/数据集; run;

  1. 要修改数据集时,要用 data 语句重新创建一个数据集,再用 set 语句复制,才能进行修改。data 语句的作用是创建新的空白数据集,而不是打开数据集。
  2. 改变数据集中变量的属性时,要将改变属性的变量数据保存到一个新的变量中,再利用 drop 语句删除原来的变量,最后改变那个新的变量的名字回原来变量的名字。
drop 变量1 变量2 ...;

  1. 临时变量可以调用,但不会显示出来。
利用 merge 语句进行横向合并:
data 数据集; merge 数据集1 数据集2 ...; by 变量1 变量2 ...; run;

  1. by 语句是索引变量。
  2. 在利用 by 语句横向合并时,如果两个数据集事先没有按 id 排序,一定要先分别对它们都排序才能合并。
  3. merge 语句同样也有数据集选项。
2.2 数据对比
proc compare ; by 变量1 变量2 ...; id 变量1 变量2 ...; run;

base 和 compare 分别制定两个比较和被比较的数据集;nosummary 的作用是不显示一些概括性的结果;transpose 的作用是按记录显示不一致的结果。
by 语句跟 merge 合并中的 by 语句作用相同,指定索引变量,避免错位。
id 语句通常指定索引变量。
2.3 数据清洗——查找和删除重复值
proc sort ; by 变量1 变量2 ...; run;

proc sort 语句调用排序过程。data=https://www.it610.com/article/数据集指定对哪个数据集排序。out=数据集将排序好的数据输出到指定数据集中,**没有该语句,排序好的数据将会覆盖原数据集。**nouniquekey 选项的作用是输出重复值,nodupkey 选项的作用是删除重复值。
EX:
在使用 sort 过程时,sort 过程会自动生成两个变量,first.变量和 last.变量,这两个变量分别表示某变量某个值的第一个和最后一个观测。
2.4 数据清洗——查找缺失值 EX1:只要你想对多个变量执行完全相同的操作,就可以考虑用数组批量执行这些操作,这可以大幅提高效率。
array 数组名[下标] <$> <数组元素> <(元素初始值))>:

array 是定义数组的标志,看到 array,你就要知道后面跟着的是数组。
数组名是给数组起个名字。
下标指定数组中包含的元素个数,这里的元素一般就是变量。
数组元素主要是列出数组中包含的 1 个或多个变量,这些变量可以使数据集重的已有变量,也可以使新变量。如果新建的变量是字符型,需要在前面加上 $ 符号。
元素初始值指定新变量的值,如果不制定元素初始值,默认新变量的值为缺失值。
注意事项:
  • 数组名不能与数据集中已有变量重名,也不要与已有函数同名。
  • 一个数组中的变量类型必须相同,不能机油数值型,又有字符型。
  • 数组中下边的写法即可以用 [],也可以用 {} 或 (),根据个人习惯而定。
  • 数组中的下标也可以是个范围,如 array x[11:15] y11 y12 y13 y14 y15; 。
  • 数组中“下标”可以不写,而用 * 代替。SAS 会自动根据变量个数来判断下标值。
  • 数组中的“数组元素”可以不写。
  • 元素初始值一定要用 () 括起来,各个值之间可以用都好或空格隔开。
EX2;自动变量
自动变量 解释
n 表示观测或记录的序号
numeric 表示数据集中的所有数值型变量
character 表示数据集中的所有字符型变量
all 表示数据集中的所有变量
书中的万能代码
data missing; set sasuser.xb; array cha[*] _character_ ; do i=1 to dim(cha); if missing(cha[i]) then output; end; array num[*] _numeric_ ; do i=1 to dim(num); if missing(num[i]) then output; end; proc print; run;

2.5 数据清洗——查找异常值
data 新数据集; set 已有数据集; if|where 条件语句; proc print; run;

这几条语句的意思是建立一个新数据集,然后利用 set 语句把原有的数据集复制进来,但并非全部复制,而是根据 if 或 where 语句指定的条件,仅复制符合条件(如缺失或异常等)的记录。
EX:
if 和 where 的区别:where 是在数据读入之前就执行选择条件,而 if 是在数据读入之后才执行。所以 where 比 if 快。
只能用 if 的几种场合(并非全部场合)
  1. 使用 SAS 的自动变量时,只能用 if,不能用 where。
  2. 如果指定的条件变量是新产生的变量,只能用 if,不能用 where。
只能用 where 的几种场合(并非全部场合)
  1. 当使用某些特殊运算符时,只能用 where 语句,不能用 if 语句。
特殊运算符 作用
between…and 指定介于数值变量两个值之间的观测
contains “指定字符” 指定字符型变量中包含指定字符的观测
like “指定字符” 指定字符变量中与指定字符相似的观测,模糊部分可用 % 或 _ 代替,% 代表多个字符,_ 代表 1 个字符
is null 或 is missing 指定包含缺失值的观测
  1. 当我们调用某一 proc 过程是(如 proc print),如果要选择部分观测执行该过程,只能用 where 语句,不能用 if 语句。
2.6 缺失值的填补
proc mi data ; mcmc; var 变量1 变量2 ...; run;

out= 是把填补后的数据保存到自定义的数据集中;round= 选项的作用是指定填补的小数位数;minimum 和 maximum 是指定填补值的最小值和最大值。
mcmc 语句是采用马尔科夫链蒙特卡罗模拟方法来产生一个抽样分布,作为缺失值的填补技术。
var 语句指定哪些变量需要填补。
缺失数据的更新
data 新数据集; update 旧数据集 新数据集; by 索引变量; run;

EX:常见 SAS 语句
各种常见语句 作用
input 和 cards 语句 输入变量和数据
format 语句 定义变量的输出格式
set 和 merge 语句 纵向和横向合并数据集
if 和 where 语句 指定条件表达式,主要可用于筛选符合条件的记录等
do-end 循环语句 指定循环条件,重复执行某些命令
if-then 语句 指定条件,根据条件表达式结果有选择地执行某些语句
update 语句 用新数据集更新旧数据集,数据相同则不更新
drop 语句 抛弃不想要的变量
keep 语句 和 drop 语句作用相反,保留想要的变量
delete 语句 删除指定的观测,常与 if 语句合用
title 语句 指定数据集的标题,如果 title 后直接跟分号,表示取消标题
label 语句 指定某变量的标签,但它必须在 proc print 中指定 label 选项才生效
length 语句 指定某新生成变量的长度和类型,该语句一定要位于新生成变量之前
rename 语句 修改变量名
2.7 产生数据子集
  1. 选择具有相同特征的人群子集
data 新数据集; set 已有数据集; if|where 条件语句; run;

  1. 选择连续记录的数据子集
proc print data=https://www.it610.com/article/数据集(firstobs= obs=); run;

  1. 生成变量子集
data 新数据集; set 已有数据集; keep|drop 变量1 变量2 ...; run;

data 新数据集(keep|drop = 变量1 变量2 ...); set 已有数据集; run;

data 新数据集; set 已有数据集(keep|drop = 变量1 变量2 ...); run;

    推荐阅读