||
HadleyWickham 大神在2013年的访谈中提到,“如果你用了8小时进行数据清理和数据整理,而只用了2小时进行建模,那么很明显,你希望了解如何将数据清理和整理的时间尽可能缩短[1]。”
事实的确如此。以前我用在数据清洗上的时间通常是建模时间的10倍!作为一个菜鸟级的数据分析工作者,几乎每一条命令都是搜索或求助来的,写好的程序运行时满屏的bug,日子都是在抓耳挠腮中度过。R如何连接MS ACCESS数据库?如何去掉空格字符串?如何用一个数据集匹配替换另一个数据集的部分数据?如何将N个数据集合并且仅保留共有项?……随着不断解决问题、积累经验,数据清洗逐渐变得没有以前那么面目可憎了。
本文将以数据合并为例,抛砖引玉,讲一下数据合并的一些tips。
做科研的人使用的数据分析工具大多是R。R拥有自己的脚本语言和大量的统计、图形库(得益于开源社区),这让她看起来既美又实用。R虽说有一套自己的语言,还挺完备,但她最专业的还是做统计和画图,而像连接数据库、文本处理、文件操作等这些脏活可不能委屈R来干哪,做这些脏活最棒的工具是Python[2]。
但是根据我的个人经验,以及网上各路大神们的比较总结,绝大部分情况下R能够很好地胜任数据清洗的任务,毫不逊色于python。
比如有两个数据集,分别是小朋友中文课和音乐课的成绩:
> chinese
NAME CLASS CHINESE
1 Lily 1 90
2 Daisy 1 88
3 Rose 1 85
4 Cherry 2 85
5 Lotus 2 82
6 Iris 2 80
7 Kate 3 80
> music
NAME CLASS MUSIC
1 Lily 1 85
2 Daisy 1 85
3 Rose 1 85
4 Cherry 2 80
5 Lotus 2 80
6 Iris 2 90
现在我想把它们合并,去掉3班的小朋友,分析中文课成绩和音乐课成绩是否有相关性。最简单的,使用R的基本函数merge:
> newdata<-merge(chinese,music)
> newdata
NAME CLASS CHINESE MUSIC
1 Cherry 2 85 80
2 Daisy 1 88 85
3 Iris 2 80 90
4 Lily 1 90 85
5 Lotus 2 82 80
6 Rose 1 85 85
当数据集特别大,R的运算速度特别慢,甚至出现内存不够的情况,可以使用Hadley Wickham 大神开发的包dplyr的join函数:
> library(dplyr) #注意!这个包适用于64位R
> newdata1<-inner_join(chinese,music)
> newdata1
NAME CLASS CHINESE MUSIC
1 Lily 1 90 85
2 Daisy 1 88 85
3 Rose 1 85 85
4 Cherry 2 85 80
5 Lotus 2 82 80
6 Iris 2 80 90
Join函数包括以下几种:
inner_join#內连
left_join#左连
right_join#右连
full_join#全连
semi_join#返回能够与y表匹配的x表所有记录
anti_join#返回无法与y表匹配的x表的所记录
最后,用python的数据分析包pandas的数据合并命令pd.merge当然能轻松地完成这个任务!永远不用担心内存不够的问题!
参考:
[1] http://blog.163.com/zzz216@yeah/blog/static/16255468420147179438149/
[2] http://www.cnblogs.com/shined/p/4401223.html
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-12-22 00:35
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社