sas缺失值missing data详解
来源:互联网 发布:老司机网络什么意思 编辑:程序博客网 时间:2024/05/20 17:41
sas缺失值missing data详解
有数据的地方就有缺失值,正确管理缺失值,对我们写出清晰明了的代码非常有帮助。本文对SAS中的缺失值作一个详细的介绍。
转载请注明出处:http://blog.sina.com.cn/s/blog_5d3b177c0100e6lm.html
1 SAS的缺失值
SAS的缺失值分为两类,一类是数值型的缺失值,用(.)表示,另一类是字符型的缺失值,用(’’)或者(’ ‘)表示。例:
data miss1;
cards;
A 1
B
D 4
;
proc print;
run;
结果:
Obs
1
2
3
4
除了上述的表示方式之外,我们还可以用特殊字符A-Z或_来表示(如.Z等),这在调查问卷等很有用,比如A表示不回答,N表示不知道,R表示未回复,_表示拒绝等。这样子使得缺失值有不同的含义,例:
data miss2;
cards;
A -1
A .
B r
D 0
E 6
F n
G _
;
proc print;
run;
结果:
Obs
1
2
3
4
5
6
7
8
9
除此这外,我们还可以对不同的缺失缺赋予不同的格式。例:
proc format;
run;
proc print data=miss2;
var charmiss nummiss;
run;
结果:
Obs
1
2
3
4
5
6
7
8
9
2 缺失值的引用
我们先查看一下不同的缺失值的排序方式:
proc sort data=miss2 out=miss3;
by nummiss;
run;
proc print data=miss3;
run;
结果:
Obs
1
2
3
4
5
6
7
8
9
我们从上面的结果可以看到,从小到大的排序结果为:_ . A N R然后是数字。
缺失值的引用1:查看数据集中nummiss非.的数据
proc sort data=miss2(where=(nummissne .)) out=miss3;
by nummiss;
run;
proc print data=miss3;
run;
结果:
Obs
1
2
3
4
5
6
7
8
缺失值的引用2:查看数据集中nummiss非空的数据
proc sort data=miss2(where=(nummissnot in (. ._ .r .a .n)))out=miss3;
by nummiss;
run;
proc print data=miss3;
run;
结果:
Obs
1
2
3
4
缺失值的引用3:查看数据集中nummiss非.Z的数据
proc sort data=miss2(where=(nummiss le .z))
by nummiss;
run;
结果:
Obs
1
2
3
4
5
缺失值的引用4:查看数据集中nummiss比.Z大的数据
proc sort data=miss2(where=(nummiss gt .z))
by nummiss;
run;
结果:
Obs
1
2
3
4
缺失值的引用5:查看数据集中charmiss非空的数据
proc sort data=miss2(where=(charmiss ne ''))
by nummiss;
run;
结果:
Obs
1
2
3
4
5
6
7
缺失值的引用6:查看数据集中nummiss非空数据
proc sort data=miss2(where=(nummiss is not missing))out=miss3;
by nummiss;
run;
或者:
proc sort data=miss2(where=(nummiss is not null)) out=miss3;
by nummiss;
结果:
Obs
1
2
3
4
3 MISSING和NMISS函数介绍
MISSING:可用于字符型和数字型变量,当变量为空时,返回1,当变量不为空时,返回0。特定的缺失字符如A N R_也为空处理。例如:
proc sort data=miss2(where=(missing(nummiss)))
by nummiss;
run;
结果:
Obs
1
2
3
4
5
这里,当nummiss为空时,missing(nummiss)返回1,数据输出到miss3中。当nummiss不为空时,missing(nummiss)返回0,数据不输出。
NMISS:只用于数字型变量,返回一组变量的值中缺失值个数。例:
先建立一个数据集:
data test;
cards;
;
run;
data countmiss;
set test;
run;
proc print;
run;
结果:
Obs
1
2
3
4
5
6
7
这里miss_c记录了每一行有多少个变量的值为缺失值。
类似的,我们也可以用missing函数来实现
data countmiss;
by n;
miss_c=sum(missing(score1),missing(score2),missing(score3),missing(score4));
run;
我们还可以衍生更多的变量:
data test2;
by n;
run;
结果:
Obs
1
2
3
4
5
6
7
4 merge和update缺失值数据
UPDATE:用新数据集的数据更新主表数据
MERGE:将两个数据集合并为一个数据集。
先建立两个数据集MISSDT1和MISSDT2
data MISSDT1;
cards;
1
2
3
4
5
;
run;
data MISSDT2;
cards;
1
2
3
4
5
;
run;
用merge:
data merged;
by visit;
run;
结果:
Obs
1
2
3
4
5
用UPDATE
data updated;
run;
结果:
Obs
1
2
3
4
5
如果加上选项UPDATEMODE=< MISSINGCHECK|NOMISSINGCHECK>
data updated;
run;
得到的结果跟merge一样。
5 SAS中缺失值处理
利用Array填补缺失值0
%macro missing(data);
data &data;
set &data;
array TEMP _numeric_;
run;
data &data;
set &data;
array TEMP _character_;
run;
%mend;
%missing(cx);
删除缺失值
如果出现缺失值,就删掉该条记录
data AnalysisData;
如果出现大于N(这里n=2)个的缺失值,就删掉该记录。
data AnaylsisData;
6 缺失值处理要注意的地方
缺失值小于0,即当变量X为缺失值时,X<0为true。
对缺失值与其它值进行+或-运算时,结果为缺失值。如果想返回非缺失值,就得用sum函数,其返回非缺失值的数据之和。
很多过程步(SUMMARY, TABULATE, FREQ,CALENDAR等)都忽略缺失值,除非你加入nomissing选项
有些过程步会分别处理缺失值数据,例如SUMMARY将分别得到非缺失的数据个数和缺失值的数据个数。
例:
data _null_;
a=.;
b=0;
c=-7;
d=99;
add=a+b+c+d;
put '缺失值与非缺失值相加,结果为缺失值 ' add=;
sum=sum(a,b,c,d);
put '缺失值与非缺失值用sum函数,结果为非缺失值之和:' sum=;
summiss=sum(.,a);
put '缺失值求sum函数,结果为缺失值 ' summiss=;
sumzero=sum(0,.,a);
put '0和缺失值求sum函数,结果为0 ' sumzero=;
*查看缺失值与0的大小关系;
if a<0then
put '缺失值小于0';
else if a>0then
put '缺失值大于0';
run;
日志的输出结果:
缺失值与非缺失值相加,结果为缺失值 add=.
缺失值与非缺失值用sum函数,结果为非缺失值之和:sum=92
缺失值求sum函数,结果为缺失值 summiss=.
0和缺失值求sum函数,结果为0 sumzero=0
缺失值小于0
主要参考文献:
MISSING! - Understanding and Making the Most of Missing Data
http://www2.sas.com/proceedings/sugi31/025-31.pdf
Tools of Miss-Calculation: Managing Missing Values with SAS
http://www2.sas.com/proceedings/forum2008/082-2008.pdf
Chapter 1 A Collection of Useful Tips
http://www.sas.com/service/doc/pubcat/chaps/55513.pdf
- sas缺失值missing data详解
- 【转载】SAS INTNX详解
- [Sklearn应用4] Preprocessing data (四)missing values 缺失值处理
- 关于缺失值(missing value)的处理
- pandas:填充缺失值 fillna("missing") 和fillna("missing",inplace=True)的区别
- SAS:proc sql中对空值(缺失值)的处理
- 【转载】SAS Hash 对象
- Data Mining Competition中数据缺失值处理
- Android 缺失R文件
- SAS--Perl Regular Expressi…
- 关于使用Sklearn进行数据预处理 —— 缺失值(Missing Value)处理
- Missing Number 第一个缺失的数
- LeetCode 268. Missing Number(缺失数字)
- LeetCode 163. Missing Ranges(缺失区间)
- 268. Missing Number 找出缺失的数
- missing letters --找缺失的字母
- LeetCode-268:Missing Number(寻找缺失数字)
- laravel 'Data Missing'
- 张召忠
- c/c++复习日记 1.不带缓存的I/O和标准I/O
- access vba代码直接创建网络盘符或打开内部网络共享文件夹
- linux学习笔记(1)-Vim编辑器
- 基于OpenGL的滤镜架构搭建(IOS)
- sas缺失值missing data详解
- SAS宏技术中,%let和call sym…
- Proc Means:Means过程介绍
- Python标准库01 正则表达式 (re包)
- Merge 和 SET 的不同
- 折腾SAS数据集 -- “in=”选项…
- iOS RunLoop 初识
- Android批量打不同的渠道包方法-使用第三方插件
- Android开发进阶,让我们一起站在别人肩膀上学习