SAS|初入 SAS(二)
书籍:《小白学 SAS》——冯国双编著
章节:第 3 章 SAS 数据清洗和加工
2. SAS 数据清洗和加工
- 2.1 数据合并
- 2.2 数据对比
- 2.3 数据清洗——查找和删除重复值
- 2.4 数据清洗——查找缺失值
- 2.5 数据清洗——查找异常值
- 2.6 缺失值的填补
- 2.7 产生数据子集
data 数据集;
set 数据集1(数据集选项) 数据集2(数据集选项) ...;
run;
- set 语句后面如果只加一个数据集,则为复制该数据集。
- 【SAS|初入 SAS(二)】数据集选项常用的两个:(in=临时变量1) 可以针对该数据集创建一个临时变量,当数据属于该数据集时,该临时变量值为 1,否则为 0;(rename=(原名 1= 新名 1 …)) 可以将该数据集的变量改变名字。
- 使用 contents 可以看数据集变量的属性。
proc contents data=https://www.it610.com/article/数据集;
run;
- 要修改数据集时,要用 data 语句重新创建一个数据集,再用 set 语句复制,才能进行修改。data 语句的作用是创建新的空白数据集,而不是打开数据集。
- 改变数据集中变量的属性时,要将改变属性的变量数据保存到一个新的变量中,再利用 drop 语句删除原来的变量,最后改变那个新的变量的名字回原来变量的名字。
drop 变量1 变量2 ...;
- 临时变量可以调用,但不会显示出来。
data 数据集;
merge 数据集1 数据集2 ...;
by 变量1 变量2 ...;
run;
- by 语句是索引变量。
- 在利用 by 语句横向合并时,如果两个数据集事先没有按 id 排序,一定要先分别对它们都排序才能合并。
- merge 语句同样也有数据集选项。
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 会自动根据变量个数来判断下标值。
- 数组中的“数组元素”可以不写。
- 元素初始值一定要用 () 括起来,各个值之间可以用都好或空格隔开。
自动变量 | 解释 |
---|---|
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 的几种场合(并非全部场合)
- 使用 SAS 的自动变量时,只能用 if,不能用 where。
- 如果指定的条件变量是新产生的变量,只能用 if,不能用 where。
- 当使用某些特殊运算符时,只能用 where 语句,不能用 if 语句。
特殊运算符 | 作用 |
---|---|
between…and | 指定介于数值变量两个值之间的观测 |
contains “指定字符” | 指定字符型变量中包含指定字符的观测 |
like “指定字符” | 指定字符变量中与指定字符相似的观测,模糊部分可用 % 或 _ 代替,% 代表多个字符,_ 代表 1 个字符 |
is null 或 is missing | 指定包含缺失值的观测 |
- 当我们调用某一 proc 过程是(如 proc print),如果要选择部分观测执行该过程,只能用 where 语句,不能用 if 语句。
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 语句 | 修改变量名 |
- 选择具有相同特征的人群子集
data 新数据集;
set 已有数据集;
if|where 条件语句;
run;
- 选择连续记录的数据子集
proc print data=https://www.it610.com/article/数据集(firstobs= obs=);
run;
- 生成变量子集
data 新数据集;
set 已有数据集;
keep|drop 变量1 变量2 ...;
run;
data 新数据集(keep|drop = 变量1 变量2 ...);
set 已有数据集;
run;
data 新数据集;
set 已有数据集(keep|drop = 变量1 变量2 ...);
run;
推荐阅读
- EffectiveObjective-C2.0|EffectiveObjective-C2.0 笔记 - 第二部分
- 遇到一哭二闹三打滚的孩子,怎么办┃山伯教育
- 赢在人生六项精进二阶Day3复盘
- 2019年12月24日
- 陇上秋二|陇上秋二 罗敷媚
- 一百二十三夜,请嫁给我
- 迷失的世界(二十七)
- 我要我们在一起(二)
- 基于|基于 antd 风格的 element-table + pagination 的二次封装
- (二)ES6第一节变量(let|(二)ES6第一节变量(let,const)