星期一, 二月 04, 2013
XML和XPath使用方法备忘
如果把XML看作传统的关系数据库,那么XPath就是SQL。R语言中的XML包可用来解析处理XML或是HTML数据。在之前的文章中,我们了解到readHTMLTable函数,如果页面中的数据是一个规整的表格,用它是很方便的,但如果页面中是一些非结构化的数据,就要用到XML包中的其它函数了。其中最重要两个函数是xmlTreeParse()和getNodeSet(),前者负责抓取页面数据并形成树状结构,后者对抓取的数据根据XPath语法来选取特定的节点集合。下面用一个简单的例子来看一下这两个函数配合使用的效果。
星期六, 十二月 22, 2012
新书推荐:脏数据手册
当你学完一本数据分析软件教程,在电脑上做完了所有的练习题,志得意满地准备去处理实际问题时候,你会被真实世界的“脏数据”所震惊。例如那些随处可见的缺失和格式不一的数据会让分析工作举步维艰,但脏数据的陷阱远不止这些。初入数据江湖的白板青年很需要一本江湖经验手册来帮助成长,而《Bad Data Handbook》正好满足了这种需要。
该书由十九位江湖高手合力联手写成,作者包括了数据分析领域的数据科学家和统计学、物理学、经济学的学术专家,他们分享了自己在处理非常规数据问题的经验和技巧。例如对数据进行分析前的观察测试,如何处理棘手的表格数据,应付各种编码问题,进行网页数据抓取,处理文本数据,以及一些数据质量控制的方法。这些秘诀在一般的传统教科书上是难以见到的。正所谓江湖险恶,要行走数据江湖则必看此书。
星期四, 十二月 13, 2012
星期日, 十一月 25, 2012
如何批量处理文本文件
最近数据堂为了弄数据挖掘比赛提供了一批用户行为日志数据。对于以前没玩过的数据,我是特别的好奇。处理这批文本文件确实花了不少时间。数据以不同的日期作文件夹分别存放,每个文件夹中又有近一千个文本文件,每个文件都是一个用户的行为日志。为了分析这些数据,首先需要将这两万个文本文件读入R中,再用字符串函数进行处理成结构化的数据。处理方法如下:
星期五, 九月 21, 2012
抓取网页数据的几种套路
没有数据就没有乐趣。有的数据提供者心肠很好,会直接给出txt或是csv文档。这个时候我们可以直接在R里头用read.table()函数把数据读进来。
有的时候我们需要的数据在网页上以一个表格呈现,例如前面文章遇到过的地震数据。此时可以用XML包中的readHTMLTable()函数读取数据,后续再配合一些字符串处理一般就OK了。
如果你对R不大熟悉,抓取这些表格也有更方便的法子,就是利用Chrome的扩展。有两个扩展值得推荐使用:一个扩展叫作table capture,它会自动找出网页中的若干表格,你只需选择所需的那个将其拷贝到剪贴板即可,然后再用下面的命令就可以读入到R中。
data <- read.table('clipboard',T)
另一个扩展叫作scraper。先选择你所需要的部分内容,然后右键选择scraper similar也能抓取表格,不过它会存到一个google doc中去。在天朝这玩意儿不大方便。
有些数据不是以表格方式出现的,例如用XML或是JSON方式储存的数据。在R中都有对应的包来处理。下面的示例即是用XML包来处理XML数据。在此之先你需要有一点关于XML和XPath的知识,首先处理的对象是这样一个页面:http://www.w3schools.com/xml/plant_catalog.xml
library(XML) xml.url <- "http://www.w3schools.com/xml/plant_catalog.xml" # 解析xml页面 xmlfile <- xmlTreeParse(xml.url) # 观察对象属性 class(xmlfile) # 获取根结点 xmltop <- xmlRoot(xmlfile) # 用xmlValue函数获取叶结点处的值 xmlValue(xmltop[[1]][[1]]) xmlValue(xmltop[['PLANT']][['COMMON']]) # xmlSApply类似于sapply函数,取出第一个子结点中的所有叶结点值 xmlSApply(xmltop[[1]],xmlValue) # 进一步可以取出所有子结点中的叶结点值 plantcat <- xmlSApply(xmltop, function(x) xmlSApply(x, xmlValue)) # 将数据转为数据框 plantcat_df <- data.frame(t(plantcat),row.names=NULL) plantcat_df[1:5,1:4]
有时候会遇到更为复杂的XML页面,此时的节点内含有参数值。如果要获取这些数据则需要使用getNodeSet()函数配合xmlValue()函数。当遇到更为复杂的数据,那我们只能用readLines读进来,再用字符串函数配合正则表达式来加以处理了。
参考资料:
http://www.omegahat.org/RSXML/Tour.pdf http://www.stat.berkeley.edu/~statcur/Workshop2/Presentations/XML.pdf
星期三, 七月 25, 2012
用stringr包处理字符串
《Machine Learning for Hackers》一书的合著者John Myles White近日接受了一个访谈。在访谈中他提到了自己在R中常用的几个扩展包,其中包括用ggplot2包来绘图,用glmnet包做回归,用tm包进行文本挖掘,用plyr、reshape、lubridate和stringr包进行数据预处理。这些包本博客大部分都有所介绍,今天就来看看这个遗漏的stringr包。
从名字就看得出,stringr包是用来处理字符串的。R语言本身的字符处理能力已经不错了,但使用起来并不是很方便。stringr包将原本的字符处理函数进行了打包,统一了函数名和参数。在增强功能基础上,还能处理向量化数据并兼容非字符数据。stringr包号称能让处理字符的时间减少95%。下面将其中的一些主要函数罗列一下。
星期日, 七月 01, 2012
用lubridate包来处理时间数据
人生有一道难题,那就是如何使一寸光阴等于一寸生命。在数据分析中也有一道难题,那就是如何自如的操作时间数据。R语言的基础包中提供了两种类型的时间数据,一类是Date日期数据,它不包括时间和时区信息,另一类是POSIXct/POSIXlt类型数据,其中包括了日期、时间和时区信息。一般来讲,R语言中建立时序数据是通过字符型转化而来,但由于时序数据形式多样,而且R中存贮格式也是五花八门,例如Date/ts/xts/zoo/tis/fts等等。用户很容易被一系列的数据格式所迷惑,所以时序数据的转化和操作并不是非常方便。所幸的是,我们有了lubridate包。lubridate包主要有两类函数,一类是处理时点数据(time instants),另一类是处理时段数据(time spans)。
时点类函数,它包括了解析、抽取、修改。
# 从字符型数据解析时间,会自动识别各种分隔符
> x <- ymd('2010-04-08')
# 观察x日期是一年中的第几天
> yday(x)
# 修改x日期中的月份为5月
> month(x) <- 5
星期四, 六月 07, 2012
北上广三地的空气质量抽样比较
从前看《龙文鞭影》里的小故事,印象中有“秦宓论天”这么一个典故。在莫谈国事的天朝,“天”乃是肉食者的禁脔,草民无权过问,茶馆里只能谈天气。但最近不仅不能谈“天”,据说连“天气”也不能谈了。所谓越是禁止的就越有破禁的快感。今天就来专门谈一谈天气。武汉的天气我们已经谈过,本文就来干涉下上海、北京和广州三地的天气内政,焦点即是这三个城市的空气质量情况。
我们的思路是从Twitter上采集空气质量数据,由于美国上海领事馆目前只公布了不到700条信息,所以我们只采集了660条,该数据是每小时公布一次,也就得到了最近约一个月的数据。我们的重点是AQI(Air Quality Index)数字。关于AQI的解释可以看这里。 收集的数据发现有少量是缺失值,这可能是仪器故障、爆表或是人员失误。而且广州领事馆发布的数据有不少格式不符的。数据收集之后进行了预处理,以转成容易处理的数据框格式。然后我们绘制了小提琴图,以观察不同城市的AQI数据,数值越大表明空气质量越差。
星期二, 六月 05, 2012
降维中的特征选择
在数据挖掘过程中,高维数据是非常棘手的研究对象。特别是在文本挖掘、图像处理和基因数据分析中,维度过高使很多学习器无法工作或效率降低,所以降维也是数据预处理过程的一项必要任务。降维大致有两大类别,一类是从原始维度中提取新的维度,例如主成分分析或因子分析,再或者是奇异值分解或是多维标度分析。另一类是从原始维度中选择一些子集,即称为特征选择(Feature Selection),或者叫作最佳子集选择。特征选择本质上继承了Occam's razor的思想,从一组特征中选出一些最有效的特征,使构造出来的模型更好。
进行特征选择的好处在于:
- 避免过度拟合,改进预测性能
- 使学习器运行更快,效能更高
- 剔除不相关的特征使模型更为简单,容易解释
星期四, 四月 12, 2012
在R语言中使用正则表达式
有时候我们要处理的是非结构化的数据,例如网页或是电邮资料,那么就需要用R来抓取所需的字符串,整理为进一步处理的数据形式。R语言中有一整套可以用来处理字符的函数,在之前的博文中已经有所涉及。但真正的要用好字符处理函数,则不得不用到正则表达式。正则表达式(Regular Expression、regexp)是指一种用来描述一定数量文本的模式。熟练掌握正则表达式能使你随心所欲的操作文本来达成目标。其实学习正则表达式并没有想像中的那么困难。最好方法是从例子开始,然后多练习,多使用。网络上已经有许多不错的参考资料,例如这篇或那篇。本文假设你对正则表达式有了基本的了解,下面我们来看看如何在R里面来使用它。
星期六, 三月 24, 2012
如何使用reshape包进行数据汇总
在数据分析过程中,利用各种图表进行数据探索是必要的前期工作。描述性统计中就包括了直方图、散点图等工具来探索连续数据,对于分类数据,则可以采用条形图、交叉分组表等工具。Excel中所谓的“数据透视表”,其实就是一个交互式的交叉分组表。在R语言中可以很容易的用table()等函数得到相应的结果。对于一些更为复杂的任务,就需要其它的函数或包来完成。本例先以iris数据集为研究对象示范一些基本函数的用法,再介绍reshape包的强大功能。
iris数据集中有五个变量,其中Species表示鸢尾属花的子类,其它四个变量分别是花瓣和萼片的长度和宽度。你可以用head(iris)来观察原始数据的一些样本。我们的第一个任务是想计算不同种类花在四个指标上的平均值。用到的函数有tapply,by及aggregate。这篇文章对它们有所涉及。
iris数据集中有五个变量,其中Species表示鸢尾属花的子类,其它四个变量分别是花瓣和萼片的长度和宽度。你可以用head(iris)来观察原始数据的一些样本。我们的第一个任务是想计算不同种类花在四个指标上的平均值。用到的函数有tapply,by及aggregate。这篇文章对它们有所涉及。
星期日, 九月 25, 2011
caret包应用之一:数据预处理
在进行数据挖掘时,我们会用到R中的很多扩展包,各自有不同的函数和功能。如果能将它们综合起来应用就会很方便。caret包(Classification and Regression Training)就是为了解决分类和回归问题的数据训练而创建的一个综合工具包。下面的例子围绕数据挖掘的几个核心步骤来说明其应用。
本例涉及到的数据是一个医学实验数据,载入数据之后可以发现其样本数为528,自变量数为342,mdrrDescr为自变量数据框,mdrrClass为因变量。
本例涉及到的数据是一个医学实验数据,载入数据之后可以发现其样本数为528,自变量数为342,mdrrDescr为自变量数据框,mdrrClass为因变量。
library(caret)本例的样本数据所涉及到的变量非常多,需要对变量进行初步降维。其中一种需要删除的变量是常数自变量,或者是方差极小的自变量,对应的命令是nearZeroVar,可以看到新数据集的自变量减少到了297个。
data(mdrr)
订阅:
博文 (Atom)








