R语言与DataFrame 什么是DataFrame
引用 r-tutor上的定义:
DataFrame 是一个表格或者类似二维数组的结构,它的各行表示一个实例,各列表示一个变量。
没错,DataFrame就是类似于Excel表格和MySQL数据库一样是一个结构化的数据体。而这种结构化的数据体是当代数据流编程中的中流砥柱,几乎所有先进算法的载体都是DataFrame,比如现在我们耳熟能详的逻辑回归算法、贝叶斯算法、支持向量机算法、XGBoost算法等等都建立在这个数据流编程的基础之上,我们可以在R、Python、Scala等函数式编程中找到他们的身影。
R中的DataFrame数据流编程参考前文 [[原]基于RStudio Webinars的统计报告Web化与工程化实践总结](https://segmentfault.com/a/11...我们将数据流编程分为数据读取、数据清洗、数据处理、数据可视化以及数据建模五个模块。
数据读取 readr/httr/DBI readrreadr简化了我们读取多种格式表格型数据的方法,包括分割文件withread_delim(),read_csv()、read_tsv()、read_csv2()、固定宽度文件读取的read_fwf()、read_table()以及read_log()来读取Web日志文件。在参数配置方面是和原生的read.xxx()函数族是看齐的。
readr是利用C++和RCpp编写的,所以执行的速度是相当快的,不过相对于直接用C语言写的data.table::fread()就稍微慢大概1.2-2倍左右。在实际使用中,data.talbe::fread()的读取速度可以比原生的read.csv有3-10倍的提升速度。
httrhttr是一个高级的网络请求库,类似于Python中的Tornado和Requests,除了提供基本的Restful接口设计功能,比如GET(), HEAD(),PATCH(), PUT(), DELETE() 和 POST(),还提供了OAuth的调用,比如oauth1.0_token()和oauth2.0_token()。而且httr还提供了诸如session、cookie、SSL、header、proxy、timeoutd等更过高级管理功能。当然你可以用它来做简单的爬虫应用,如果需要更高级的爬虫,我们需要投入rvest的怀抱来支持诸如xpath等高级爬虫特性。
DBIDBI是一个为R与数据库通讯的数据库接口。相当于Java里面的DAO,Python里的Torndb和Tornlite,方便多种关系型数据库的SQL请求。其中最亮眼的是,R中的DataFrame和数据库之前可以以整个数据框插入的形式插入数据而不需要再拼接SQL语句。
以下是一个官方文档的示例:
library(DBI) # 创建一个临时内存的 RSQLite 数据库 con <- dbConnect(RSQLite::SQLite(), dbname = ":memory:") dbListTables(con) # 直接插入整个数据框到数据库中 dbWriteTable(con, "mtcars", mtcars) dbListTables(con) dbListFields(con, "mtcars") dbReadTable(con, "mtcars") # 你可以获取所有结果: res <- dbSendQuery(con, "SELECT * FROM mtcars WHERE cyl = 4") dbFetch(res) dbClearResult(res) # 或者一次取一块 res <- dbSendQuery(con, "SELECT * FROM mtcars WHERE cyl = 4") while(!dbHasCompleted(res)){ chunk <- dbFetch(res, n = 5) print(nrow(chunk)) } dbClearResult(res) dbDisconnect(con) 数据清洗 tidyr/jsonlite tidyrtidyr是一个数据清洗的新包,正在取代reshape2、spreadsheets等包。清洁的数据在数据处理的后续流程中十分重要,比如数据变化(dplyr),可视化(ggplot2/ggvis)以及数据建模等。tidyr主要提供了一个类似Excel中数据透视表(pivot table)的功能,提供gather和spread函数将数据在长格式和宽格式之间相互转化,应用在比如稀疏矩阵和稠密矩阵之间的转化。此外,separate和union方法提供了数据分组拆分、合并的功能,应用在nominal数据的转化上。
jsonlite类似于Python中的json库,参考前文 [[原]数据流编程教程:R语言与非结构化数据共舞](https://segmentfault.com/a/11...,我们可以知道jsonlite是一个标准的json转化库,依赖于jsonlite我们可以***地在JSON和DataFrame之间相互转化。
数据处理 dplyr/rlist/purrr dplyrdplyr包是现在数据流编程的核心,同时支持主流的管道操作 %>%,主要的数据处理方法包括:
高级查询操作:
select(): 按列变量选择
filter(): 按行名称分片
slice(): 按行索引分片
mutate(): 在原数据集最后一列追加一些数据集
summarise(): 每组聚合为一个小数量的汇总统计,通常结合gruop_by()使用
arrange(): 按行排序
关联表查询
inner_join(x, y): 匹配 x + y
left_join(x, y): 所有 x + 匹配 y
semi_join(x, y): 所有 x 在 y 中匹配的部分
anti_join(x, y): 所有 x 在 y 中不匹配的部分
集合操作
intersect(x, y): x 和 y 的交集(按行)
union(x, y): x 和 y 的并集(按行)
setdiff(x, y): x 和 y 的补集 (在x中不在y中)
更多详细操作可以参考由SupStats翻译的 数据再加工速查表,比Python的老鼠书直观很多。
rlist