笔记 4 数据获取与整理
4.1 概述
Raw data -> Processing script -> tidy data
- 前期需求
- 原始数据
- 干净数据
- code book
- 详尽的处理步骤记录
- 原始数据要求
- 未经处理
- 未经修改
- 未经去除异常值
- 未经总结
- 干净数据
- 每个变量一列
- 同一变量不同样本不在一行
- 一种变量一个表
- 多张表要有一列可以相互链接
- 有表头
- 变量名要有意义
- 一个文件一张表
- code book
- 变量信息
- 总结方式
- 实验设计
- 文本文件
- 包含研究设计与变量信息的章节
- 处理步骤记录
- 脚本文件
- 输入为原始数据
- 输出为处理过数据
- 脚本中无特定参数
4.2 下载
- 设定工作目录与数据存储目录
if (!file.exists("data")) {
dir.create("data")
}- url下载与时间记录
fileUrl <- "yoururl"
download.file(fileUrl, destfile = "./data/XXX.csv", method = "curl")
list.files("./data")
dateDownloaded <- date()4.3 读取本地文件
read.tableread.csv默认sep=",", header=TRUEquote设定引用na.strings设定缺失值字符nrows设定读取字段skip跳过开始行数
4.4 读取excle文件
- xlsx包
library(xlsx)
cameraData <- read.xlsx("./data/cameras.xlsx",sheetIndex=1,header=TRUE)
head(cameraData)
# read.xlsx2更快不过选行读取时会不稳定
# 支持底层读取 如字体等- XLConnect包
library(XLConnect)
wb <- loadWorkbook("XLConnectExample1.xlsx", create = TRUE)
createSheet(wb, name = "chickSheet")
writeWorksheet(wb, ChickWeight, sheet = "chickSheet", startRow = 3, startCol = 4)
saveWorkbook(wb)
# 支持区域操作 生成报告 图片等4.5 读取XML文件
- 网页常用格式
- 形式与内容分开
- 形式包括标签 元素 属性等
- XML包
library(XML)
fileUrl <- "http://www.w3schools.com/xml/simple.xml"
# 读取xml结构
doc <- xmlTreeParse(fileUrl,useInternal=TRUE)
# 提取节点
rootNode <- xmlRoot(doc)
# 提取根节点名
xmlName(rootNode)
# 提取子节点名
names(rootNode)
# 提取节点数值
xmlSApply(rootNode,xmlValue)- XPath XML的一种查询语法
- /node 顶级节点
- //node 所有子节点
- node(???) 带属性名的节点
- node(??? =“bob”) 属性名为bob的节点
# 提取节点下属性名为name的数值
xpathSApply(rootNode,"//name",xmlValue)4.6 读取json文件
- js对象符号 结构化 常作为API输出格式
- jsonlite包
library(jsonlite)
# 读取json文件
jsonData <- fromJSON("https://api.github.com/users/jtleek/repos")
# 列出文件名
names(jsonData)
# 可嵌套截取
jsonData$owner$login
# 可将R对象写成json文件
myjson <- toJSON(iris, pretty=TRUE)4.7 读取MySQL数据库
library(RMySQL)
# 读取数据库
ucscDb <- dbConnect(MySQL(),user="genome",
host="genome-mysql.cse.ucsc.edu")
result <- dbGetQuery(ucscDb,"show databases;");
# 断开链接
dbDisconnect(ucscDb);
# 读取指定数据库
hg19 <- dbConnect(MySQL(),user="genome", db="hg19",
host="genome-mysql.cse.ucsc.edu")
allTables <- dbListTables(hg19)
length(allTables)
# mysql语句查询
dbGetQuery(hg19, "select count(*) from affyU133Plus2")
# 选择子集
query <- dbSendQuery(hg19, "select * from affyU133Plus2 where misMatches between 1 and 3")
affyMis <- fetch(query); quantile(affyMis$misMatches)4.8 读取HDF5数据
- 分层分组读取大量数据的格式
- rhdf5包
library(rhdf5)
created = h5createFile("example.h5")
created = h5createGroup("example.h5","foo")
created = h5createGroup("example.h5","baa")
created = h5createGroup("example.h5","foo/foobaa")
h5ls("example.h5")
A = matrix(1:10,nr=5,nc=2)
h5write(A, "example.h5","foo/A")
B = array(seq(0.1,2.0,by=0.1),dim=c(5,2,2))
attr(B, "scale") <- "liter"
h5write(B, "example.h5","foo/foobaa/B")
h5ls("example.h5")
df = data.frame(1L:5L,seq(0,1,length.out=5),
c("ab","cde","fghi","a","s"), stringsAsFactors=FALSE)
h5write(df, "example.h5","df")
h5ls("example.h5")
readA = h5read("example.h5","foo/A")
readB = h5read("example.h5","foo/foobaa/B")
readdf= h5read("example.h5","df")4.9 读取网页数据
- 网页抓取HTML数据
- 读完了一定关链接
- httr包
con = url("http://scholar.google.com/citations?user=HI-I6C0AAAAJ&hl=en")
htmlCode = readLines(con)
close(con)
htmlCode
library(XML)
url <- "http://scholar.google.com/citations?user=HI-I6C0AAAAJ&hl=en"
html <- htmlTreeParse(url, useInternalNodes=T)
xpathSApply(html, "//title", xmlValue)
library(httr)
html2 = GET(url)
content2 = content(html2,as="text")
parsedHtml = htmlParse(content2,asText=TRUE)
xpathSApply(parsedHtml, "//title", xmlValue)
GET("http://httpbin.org/basic-auth/user/passwd")
GET("http://httpbin.org/basic-auth/user/passwd",
authenticate("user","passwd"))
google = handle("http://google.com")
pg1 = GET(handle=google,path="/")
pg2 = GET(handle=google,path="search")4.10 读取API
- 通过接口授权后调用数据
- httr包
myapp = oauth_app("twitter",
key="yourConsumerKeyHere",secret="yourConsumerSecretHere")
sig = sign_oauth1.0(myapp,
token = "yourTokenHere",
token_secret = "yourTokenSecretHere")
homeTL = GET("https://api.twitter.com/1.1/statuses/home_timeline.json", sig)
json1 = content(homeTL)
json2 = jsonlite::fromJSON(toJSON(json1))4.12 数据截取与排序
- 增加行直接
$ seq产生序列- 通过
[按行 列或条件截取 which返回行号- 排序向量用
sort - 排序数据框(多向量)用
order - plyl包排序
library(plyr)
arrange(X,var1)
arrange(X,desc(var1))4.13 数据总结
headtail查看数据summarystr总结数据quantile按分位数总结向量table按向量元素频数总结sum(is.na(data))any(is.na(data))all(data$x > 0)异常值总结colSums(is.na(data))行列求和table(data$x %in% c("21212"))特定数值计数总结xtabsftable创建列联表print(object.size(fakeData),units="Mb")现实数据大小cut通过设置breaks产生分类变量- Hmisc包
library(Hmisc)
data$zipGroups = cut2(data$zipCode,g=4)
table(data$zipGroups)
library(plyr)
# mutate进行数据替换或生成
data2 = mutate(data,zipGroups=cut2(zipCode,g=4))
table(data2$zipGroups)4.14 数据整理
- 每一列一个变量
- 每一行一个样本
- 每个文件存储一类样本
melt进行数据融合reshape2包dcast分组汇总数据框acast分组汇总向量数组arrange指定变量名排序merge按照指定向量合并数据- plyr包的
join函数也可实现合并
4.15 数据操作data.table包
- 基本兼容
data.frame - 速度更快
- 通过
key可指定因子变量并快速提取分组的行 - 可在第二个参数是R表达式
DT[,list(mean(x),sum(z))]
DT[,table(y)]- 可用
:生成新变量 进行简单计算
DT[,w:=z^2]
DT[,m:= {tmp <- (x+z); log2(tmp+5)}]- 进行数据条件截取
DT[,a:=x>0]
DT[,b:= mean(x+w),by=a]- 进行计数
DT <- data.table(x=sample(letters[1:3], 1E5, TRUE))
DT[, .N, by=x]4.16 文本处理
- 处理大小写
tolowertoupper - 处理变量名
strsplit
firstElement <- function(x){x[1]}
sapply(splitNames,firstElement)- 字符替换
subgsub - 寻找变量
grep(返回行号)grepl(返回逻辑值) - stringr包
stringr paste0不带空格str_trim去除空格- 命名原则
- 变量名小写
- 描述性
- 无重复
- 变量名不要符号分割
- Names of variables should be
- 正则表达式
- 文字处理格式
^匹配开头$匹配结尾[]匹配大小写^在开头表示非.匹配任意字符|匹配或()匹配与?匹配可选择*匹配任意+匹配至少一个{}匹配其中最小最大 一个值表示精确匹配m,表示至少m次匹配\1匹配前面指代
4.17 日期处理
formate处理日期格式%d日%a周缩写%A周%m月%b月缩写%B月全名%y2位年%Y4位年weekdays显示星期months显示月份julian显示70年以来的日期- lubridate包
ymdmdydmyymd_hmsSys.timezone