楼主: glxfgsh
24520 22

[原创博文] 利用SAS进行数据清洗技术——缺失值查询 [推广有奖]

  • 0关注
  • 10粉丝

博士生

11%

还不是VIP/贵宾

-

威望
0
论坛币
1511 个
通用积分
4.6166
学术水平
4 点
热心指数
4 点
信用等级
4 点
经验
1089 点
帖子
73
精华
0
在线时间
351 小时
注册时间
2007-5-2
最后登录
2024-4-11

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
数据清洗技术是统计分析之前必做的一步,而且也是非常麻烦的一步,有时甚至花费的时间比统计分析都长。所以没有一定的技巧,这将是个非常烦人的工作。本篇文章介绍如何利用sas进行缺失值的查询工作,后面如果有时间再逐渐写一下异常值、错误值等的查询。
假定我们有数据集aa,包含如下变量(数据省略):
ID dose gender age t0 t1 a1 a2

最简单的方式当然就是挨个变量找缺失值,如下:
data missing;
set aa;
if id=. or dose=. or gender=. or age=. or t0=. or t1=. or a1=. or a2=.;
proc print;
run;
这种方式很好理解,就是利用if语句逐个判断每个变量是否有缺失(注意,如果变量时文本型,不能写=.,而是=" "),但缺点也是显而易见的,如果不是现在的8个变量,而是80个变量,那写一遍估计要累个半死。所以我们用下面的语句节省体力:
data missing(drop=i);
set aa;
array num{8} id dose gender age t0 t1 a1 a2;
do i=1 to 8;
if num{i}=. then output;
end;
这种方式好像比上面的更复杂了,但效率提高了n倍(取决于你的变量有多少)。这种方式是利用数组判断缺失值,不管有100个还是1000个变量,对数组来说没什么区别,只是数组中变量的个数改变一下而已(如本例中的8)。
当这种方式仍不是最节省的,因为我们还是需要把这8个变量一一写出来,那可不可以就不写变量名呢。当然可以,还有更简单的方式如下:
data missing(drop=i);
set aa;
array num{*} _all_;
do i=1 to dim(num);
if num{i}=. then output;
end;
当这种方式更简单了,而且是个通用语句,不管你有10个还是1000个变量,都可以用这种方式来查询,一个字母都不用改。当然前提是所有变量都是数值型,如果是文本型,那就应该是num{i}=" "。
还有另外一种非常简洁 的方式是利用函数,如下:

data missing(drop=i);

set aa;

array num{*} _all_;

do i=1 to dim(num);

if missing(num{i}) then output;

end;


用函数的这种方式有什么好处呢?起码有一点,你不用考虑到底是数值还是文本,全部都是missing(变量)就行了。否则你还得想着数值是.,文本是" "。一不小心忘了容易出问题。
前面所说的都是假定所有变量都是同一种类型的,如果变量中既有数值型,又有文本型,那怎么办呢?如下程序就很简单了:

data missing(drop=i);

set aa;

array a _numeric_;
do i=1 to dim(a);
if missing(a) then output;
end;
array b_character_;
do i=1 to dim(b);
if missing(b) then output;
end;
毫不夸张地说,这个简直就是个缺失值的通用语句,同时遍历了数据集中的数值型和文本型的所有缺失值。所有的缺失值查找,几乎都可以这一语句来实现,它几乎包含了所有的可能情况,还能苛求什么呢?套用就行了。
最后声明一下:这个是本人原创,可能有的人在我的博客或其它统计网站中见过,只是因为人大经济论坛人比较多,所以我在这里也写了一份,不是抄袭的,是本人在不同地方发布的而已。所以版主不要封我的帖。而且这篇文章是本人一次网络视频讲课的其中部分内容,写下来希望与那些对sas感兴趣的同仁一起讨论。如有对此感兴趣的,也可去参考该视频,地址:
http://www.tj211.com/thread-4498-1-1.html,可能该视频需要一定权限才能看,这跟我没关系。我不替任何网站做广告,我只代表我自己。所以版主不要删我的帖。只是我的视频正好在这个网站,如有感兴趣的可以去看看。实在看不到的,我会在以后几天有空时再把其它的内容写下来。


二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:缺失值 Character missing numeric output 文章 技术 清洗 而且 技巧

已有 2 人评分学术水平 热心指数 信用等级 收起 理由
李会超 + 1 + 2 + 2 分析的有道理
qqface123 + 1 鼓励积极发帖讨论

总评分: 学术水平 + 2  热心指数 + 2  信用等级 + 2   查看全部评分

沙发
henryyhl 发表于 2013-8-17 19:47:31 |只看作者 |坛友微信交流群
大力支持!!!好像有个问题是如果某个观测既有数值型缺失,又有字符型缺失时,这种方法好像会把这个观测输出2次。
It's not going to be easy, but it is going to be worth it.

使用道具

藤椅
tangliang0905 发表于 2013-8-18 10:29:35 |只看作者 |坛友微信交流群
嘿嘿,问题是为什么有一个观测值会既是数值型缺失,又会是字符型缺失啊?我好像一时之间想不到例子啊

使用道具

板凳
henryyhl 发表于 2013-8-19 22:24:00 |只看作者 |坛友微信交流群
tangliang0905 发表于 2013-8-18 10:29
嘿嘿,问题是为什么有一个观测值会既是数值型缺失,又会是字符型缺失啊?我好像一时之间想不到例子啊
因为一个观测有多个变量,有的变量是字符型,有的是数值型的啊。这个可以有吧
It's not going to be easy, but it is going to be worth it.

使用道具

报纸
tangliang0905 发表于 2013-8-19 22:56:20 |只看作者 |坛友微信交流群
array 本身就是针对每个变量来的把。只要没有一个变量既是数值型又是字符型就可以了

使用道具

地板
fisheryou 发表于 2013-8-20 20:24:54 |只看作者 |坛友微信交流群
henryyhl 发表于 2013-8-17 19:47
大力支持!!!好像有个问题是如果某个观测既有数值型缺失,又有字符型缺失时,这种方法好像会把这个观测输 ...
嗯,这样的写法显然是有问题的,两种类型同时缺失时,会重复输出

使用道具

7
蹄儿~~~ 发表于 2014-10-23 14:57:51 |只看作者 |坛友微信交流群
作为一个菜鸟 我弱弱地试了很久发现 上面的程序最后都应该有RUN; ……不然会一直一直运行 停不下来……另,即使是同一类型的变量还是会有重复输出的问题。后面加上
proc sort data=missing nodupkey out=missfinal;   /*删去ID值重复观测*/
by id;  run;
的话就很好用啦~谢谢楼主分享~~~

使用道具

8
木子星 发表于 2014-10-23 17:23:31 |只看作者 |坛友微信交流群
这个总结的很好  谢谢楼主

使用道具

9
sasjunior 发表于 2015-3-30 08:56:20 |只看作者 |坛友微信交流群
谢谢分享

使用道具

10
learsaas 发表于 2015-4-3 16:01:39 |只看作者 |坛友微信交流群
呵呵,n多年前就会了,而且比你还精简,不用dim了,直接do over了

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-23 13:28