数据科学(三):获取和清理数据

数据科学一系列文章的内容来源于我在Coursera中的一项专项课程Data Science的笔记,其中内容除专门指出外均来自该课程课件。

Week1:

Raw and processed data

  • Raw data:

The original source of the data.

Often hard to use for data analysis.

Data analysis includes processing.

Raw data may only need to be processed once.

  • Processed data

Data that is ready for analysis.

Processing can include merging, subsetting, transforming, etc.

There may be standards for processing.

All steps should be recorded.

 

Getting data

  • download.file()

在R软件中下载,可以提高可重复性。

重要参数包括:url,destfile(destination file存储位置),method(方法)。

可以下载制表符分隔的文件、csv文件、Excel文件等。

记录下载日期:

> dateDownloaded<-date()

> dateDownloaded

Mac系统内遇到链接带https时,需要把method参数设为curl。

  • read.table()

重要参数包括:file(文件类型),header(表头),sep(元素分隔),row.names(行名),nrows(读取行数),quote(是否存在引用值),na.strings(指出哪些字符代表缺失值),skip(开始读取之前要跳过多少行)。

  • read.xlsx()

重要参数包括:sheetIndex(表单号),colIndex(只读取指定列),rowIndex(只读取指定行)。

write.xlsx() 输出为Excel格式。

read.xlsx2() 读取更快但读取子集时会不稳定。

The XLConnect package has more options for writing and manipulating Excel files.

将文件存储成用逗号或者制表符分隔的平面文件。

  • XML(Extensible Markup Language可扩展标记语言)&HTML

Tags correspond to general labels: Start tags<section>, End tags</section>, Empty tags<line-break />.

Elements are specific example of tags: <Greeting>Hello, world</Greeting>.

Attributes are components of the label: <img src=”jeff.jpg” alt=”instructor”/>, <step number=”3”> Connect A to B. </step>.

步骤(HTML):

> fileUrl<-“链接” 指定URL链接。

> doc<-htmlTreeParse(fileUrl, useInternal=TRUE) 句法分析。

> valuea<-xpathSApply(doc, “//li[@class=’valuea’]”, xmlvalue) 提取文档的某些部分。

> valueb<-xpathSApply(doc, “//li[@class=’valueb’]”, xmlvalue)

> valuea

> valueb

  • JSON(Javascript Object Notation)

步骤:

> library(jsonlite) 加载R包。

> jsonData<-fromJSON(“链接”)

> names(jsonData)

> names(jsonData$valuea) 读取相应变量下数据。

将R数据框写做JSON格式:

> myjson<-toJSON(iris, pretty=TRUE)

> cat(myjson)

 

Data.table package

Faster at subsetting, group, and updating.

All functions that accept data.frame work on data.table.

创建data tables:

> library(data.table) 加载data.table包。

> DF=data.frame(x=rnorm(9), y=rep(c(“a”, ”b”, ”c”), each=3), z=rnorm(9)) 创建一个数据框。

> DT= data.table(x=rnorm(9), y=rep(c(“a”, ”b”, ”c”), each=3), z=rnorm(9)) 创建一个数据表。

> head(DT, 3)

 

 

Week2:

Reading from MySQL

Data structure: Databases>Tables>Fields

 

Reading from HDF5(Hierarchical Data Format层次型数据格式)

www.hdfgroup.org

在R中通过bioconductor安装:

> source(“http:// bioconductor.org/biocLite.R”)

> biocLite(“rhdf5”)

> library(rhdf5)#第一次安装biocLite包时,还需安装bioconductor的biobase包

> created=h5createFile(“example.h5”)#建立HDF5文件,文件名example

> created=h5createGroup(“example.h5”,”foo”)#建立名为foo的群组

 

Reading from The Web

> connect=url(“http://caflro.org”)#建立连接

> htmlCode=readLines(connect)#读取数据

> close(connect)

> htmlCode

> library(XML)#可以通过XML包来提取网页的特定部分

> url<-“http://caflro.org/lunyushidu1″

> html<-htmlTreeParse(url,useInternalNodes=T)#解析HTML通过useinternalNodes来获得完整结构

> xpathSApply(html,”//title”,xmlValue)#寻找“//title”标签的节点获得标题

[1] “论语释读(一) | Caflro-嘉诺网”

> library(httr);html2=GET(url)#也可以用httr包中的GET()函数

> content2=content(html2,as=”text”)#把内容提取为文本

> parsedHtml=htmlParse(content2,asText=TRUE)#解析文本并获得解析后的HTML

httr包的特点在于,可以给自己授权来访问需要输入用户名和密码的页面:

> pg2=GET(“http://caflro.org/lunyushidu1”,authenticate(“user”,”passwd”))

> pg2

通过函数handle()保留网站多路径的访问权:

> caflro=handle(“http://caflro.org”)

> pg1=GET(handle=caflro,path=”/”)#访问主页

> pg2=GET(handle=caflro,path=”lunyushidu1″)#访问特定网页

 

Reading from APIs(Application Programming Interface应用程序接口)

httr包,适用于Facebook、谷歌、Twitter以及Github等。

 

Reading from other sources

  • file() open a connection to a text file.

url() open a connection to a url.

gzfile() open a connection to a .gz file.

bzfile() open a connection to a .bz2 file.

Remember to close connections.

  • foreign() package: Loads data from Minitab, S, SAS, SPSS, Stata, Systat.

read.arff(Weka)

read.dta(Stata)

read.mtp(Minitab)

read.octave(Octave)

read.spss(SPSS)

read.xport(SAS)

·Reading images: jpeg(), readbitmap(), png(), EBImage() in Bioconductor.

·Reading GIS data: rdgal(), rgeos(), raster().

·Reading music data: tuneR(), seewave().

 

 

Week3:

Summarizing data

> quantile(数据框名$变量名,na.rm=TRUE)#查看定量变量的变异度

> quantile(数据框名$变量名,probs=c(概率,概率))#自己设置不同概率条件下的分位点

> table(数据框名$变量名,useNA=”ifany”)#查看特定变量并制作表格,数据里若有缺失值就在表上增加一列NA

> table(数据框名$变量名1,数据框名$变量名2)#以变量1为列,变量2为行制表

> table(数据框名$变量名 %in% c(“向量1″,”向量2”))#变量值是否有落在向量1或向量2上

> 数据框名[数据框名$变量名 %in% c(“向量1″,”向量2”),]#获得变量中符合向量1或向量2的值的子集

> xtabs(变量1~变量2+变量3,data=数据框名)#创建列联表,展示变量1,以变量2为列变量3为行

 

Creating new variables

  • Common variables to create:

Missingness indicators 缺失值指针,指出哪些地方有数据缺失。

“Ctting up” quantitative variables 分段数值型数据,将数值型变量对应特定值划分成因子变量。

Applying transforms 对有特殊分布的数据进行变换。

  • 创建数列:

> s1<-seq(1,10,by=2)

[1] 1 3 5 7 9

> s2<-seq(1,10,length=3)

[1] 1.0 5.5 10.0

> x<-c(1,3,8,25,100)

> seq(along=x)

[1] 1 2 3 4 5

  • 用数值型变量创建类别变量:

> 数据名$创建变量名=cut(数据名$数据变量,breaks=quantile(数据名$数据变量))#依据quantile规则来分割数据变量

> table(数据名$创建变量名)

> table(数据名$创建变量名,数据名$数据变量)

或者用Hmisc包中的cut2()函数:

> library(Hmisc)

> 数据名$创建变量名=cut2(数据名$数据变量,g=4)#将数据变量分成四段

> table(数据名$创建变量名)

  • 创建因子变量:

> 数据名$因子变量名<-factor(数据名$变量)

  • 用plyr包中的mutate()函数创建新变量并加入数据集:

> library(Hmisc)

> library(plyr)

> 新数据框<-mutate(数据名,创建变量名=cut2(数据变量,g=4))

> table(新数据框名$创建变量名)

  • 数据变换:

abs() 取绝对值

sqrt() 平方根

ceiling()/floor() 向上、向下取整

round(,digits=n) 保留小数位数

signif(,digits=n) 取有效位数

exp() 取指数指

 

Reshaping data

> melt(数据框名,id=c(“变量1″,”变量2”),measure.vars=c(“变量3″,”变量4”))#揉合数据框,以变量1和变量2为id类变量,变量3和变量4为控制变量,作为某一列的数值

> dcast(数据框名,变量1~变量2)#将数据改写进一个特定的数据框。让变量1的值作为行来输出,变量2的值作为列来输出

> dcast(数据框名,变量1~变量2,mean)#将数据改写进一个特定的数据框。让变量1的值作为行来输出,变量2的值作为列来输出,然后取变量2中数据的平均值

> head(InsectSprays)

count spray

1    10     A

2     7     A

3    20     A

4    14     A

5    14     A

6    12     A

> tapply(InsectSprays$count,InsectSprays$spray,sum)#将count变量传递给tapply,以spray为指数对count应用函数sum()

A   B   C   D   E   F

174  184  25  59  42  200

  • split-apply-combine 分割-应用-结合:

> spIns=split(InsectSprays$count,InsectSprays$spray)#按不同的杀虫剂进行划分

> spIns

$A

[1] 10 7 20 14 14 12 10 23 17 20 14 13

$B

[1] 11 17 21 11 16 14 17 17 19 21 7 13

$C

[1] 0 1 7 2 3 1 2 1 3 0 1 4

$D

[1]  3  5 12  6  4  3  5  5  5  5  2  4

$E

[1] 3 5 3 5 3 6 1 1 3 2 6 4

$F

[1] 11 9 15 22 15 16 13 10 26 26 24 13

> sprCount=lapply(spIns,sum)#汇总

> sprCount

$A

[1] 174

$B

[1] 184

$C

[1] 25

$D

[1] 59

$E

[1] 42

$F

[1] 200

> unlist(sprCount)#结合成向量

A   B   C   D   E   F

174 184  25  59  42 200

> sapply(spIns,sum)#合并前两步

A   B   C   D   E   F

174 184  25  59  42 200

  • See also the functions:

acast() for casting as multi-dimensional arrays 改写成一个数组

arrange() for faster reordering without using order() commands 更快的排序

mutate() adding new variables 加入新变量

 

Merging data

> names(数据集1)

> names(数据集2)

> merge(数据集1,数据集2,by.x=”变量1″,by.y=”变量2″,all=TRUE)#选择数据集1中的变量1为一列,数据集2中的变量2为另一列。如果某一变量只出现在一个数据集中,则在新数据集中显示。缺省情况下会合并所有具有相同列名的列

 

 

Week4:

Editing text variables

  • 替换符号:

> sub(“_”,””,names(数据框),)#替换变量名中有“_”符号的对象为没有“_”的

> gsub(“_”,””,names(数据框))#多次替换

> paste(“字符1″,”字符2”)#合并为”字符1 字符2″,有空格隔开

> paste0(“字符1″,”字符2”)#合并为”字符1字符2″,没有空格

> str_trim(“”)#去除字符中的空格

  • 查找:

> grep(“名称”,数据框$变量名,value=TRUE)#在数据框变量名下查找符合特定名称的元素,返回的值为元素名。若无value=TRUE,返回值为元素的序号

> 数据框[grepl(“名称”,数据框$变量名),]#提取符合条件的特定子集

 

Regular expressions正则表达式

字符加元字符(^、$、[]、|…)用于识别和搜索有用的内容。

^ 行首、非  $ 行尾  [^?.]$ 不以?或.结尾的所有行

[] 接受框内任何值  [a-zA-Z]表示任何字母

. 任意字符  ()? 括号内为可选

| 或,符合任一个条件  \ 转义字符,将后面的元字符视为字符

* 前面的字符重复任意多次  + 前面的字符至少包括一个

(){,} 符合括号内条件的内容出现的最小和最大次数,无“,”为绝对匹配

|1、|2 作为元字符指代前面括号内的内容

^[Gg]ood|[Bb]ad 开头为Good/good或者任一处有Bad/bad的行

^([Gg]ood|[Bb]ad) 开头为Good/good或者开头为Bad/bad的行

[Bb]ush( +[^ ]+ +){1,5}debate Bush/bush和debate之间符合“空格+任意非空字符+空格”出现过一至五次的行

+([a-zA-Z]+) +|1+ 反复出现的特定词语

 

Working with dates

  • > d1<-Sys.Date()

> d1

[1] “2018-01-11″

> format(d1,”%d %a %A %m %b %B %y %Y”)#小写显示简略写法,大写显示完整写法

[1] “11 周四 星期四 01 一月 一月 18 2018”

  • lubridate包

> library(lubridate)

> ymd(“20180110”)#年月日顺序

[1] “2018-01-10”

> mdy(“01/10/2018”)#月日年顺序

[1] “2018-01-10”

> dmy(“10-01-2018”)

[1] “2018-01-10”

> ymd_hms(“2018-01-10 10:15:03”)

[1] “2018-01-10 10:15:03”

 

Data resources

  • Open government sites

United Nations http://data.un.org/

U.S. http://www.data.gov/

United Kingdom http://data.gov.uk/

France http://www.data.gouv.fr/

Ghana http://data.gov.gh/

Australia http://data.gov.au/

Germany http://www.govdata.de/

Hong Kong http://www.gov.hk/en/theme/psi/datasets/

Japan http://www.data.go.jp/

Many more http://www.data.gov/opendatasites

  • Gapminder 关于发展特别是卫生方面的数据

http://www.gapminder.org/

  • Infochimps marketplace

http://www.infochimps.com/marketplace

  • Kaggle 组织数据科学竞赛

http://www.kaggle.com

  • Specialized collections

Stanford Large Newtork Data

UCI Machine Learning

KDD Nugets Datasets

CMU Statlib

Gene expression omnibus

ArXiv Data

Public Data Sets on Amazon Web Services