百科问答小站 logo
百科问答小站 font logo



精通 R 是一种怎样的体验? 第1页

  

user avatar   harryprince 网友的相关建议: 
      

### update 2019-04-20

R 中的 DataFrame 新趋势

  1. tidy 编程流
  2. 分布式计算
  3. 集成 NoSQL
  4. 集成各领域核心算法

按照功能来划分:

  1. 核心计算:tidyverse/sparklyr
  2. 图计算: tidygraph/graphframes
  3. 空间计算:sf/geospark/tidyraster
  4. 时间序列:tidyquant
  5. 文本计算:tidytext/tabulizer
  6. 模型构建:tidymodels
  7. 仿真建模:simmer
  8. 贝叶斯分析:tidybayes
  9. 深度学习:keras

[原] 数据科学教程:R语言与DataFrame[2019版]

如果用一张图来总结,那么是:



随着 sparklyr 生态的成熟,必须安利一波 sparklyr 相关的学习资料:

### update 2016-04-20

数据科学教程:R语言与DataFrame 2016版

首先,感谢RStudio公司的工程师们以及其他R语言开发者对R语言做出不可磨灭的贡献!


参考前文 [原]基于RStudio Webinars的统计报告Web化与工程化实践总结,我们将数据流编程分为数据读取、数据清洗、数据处理、数据可视化以及数据建模五个模块。

数据读取 readr/httr/DBIreadr

readr简化了我们读取多种格式表格型数据的方法,包括分割文件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倍的提升速度。

httr

httr是一个高级的网络请求库,类似于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等高级爬虫特性。

DBI

DBI是一个为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/jsonlitetidyr

tidyr是一个数据清洗的新包,正在取代reshape2、spreadsheets等包。清洁的数据在数据处理的后续流程中十分重要,比如数据变化(dplyr),可视化(ggplot2/ggvis)以及数据建模等。tidyr主要提供了一个类似Excel中数据透视表(pivot table)的功能,提供gather和spread函数将数据在长格式和宽格式之间相互转化,应用在比如稀疏矩阵和稠密矩阵之间的转化。此外,separate和union方法提供了数据分组拆分、合并的功能,应用在nominal数据的转化上。

jsonlite

类似于Python中的json库,参考前文 [原]数据流编程教程:R语言与非结构化数据共舞,我们可以知道jsonlite是一个标准的json转化库,依赖于jsonlite我们可以自由地在JSON和DataFrame之间相互转化。

数据处理 dplyr/rlist/purrrdplyr

dplyr包是现在数据流编程的核心,同时支持主流的管道操作 %>%,主要的数据处理方法包括:

  • 高级查询操作:

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

参考前文 [原]数据流编程教程:R语言与非结构化数据共舞,我们知道,区别于dplyr包,rlist包是针对非结构化数据处理而生的,也对以list为核心的数据结构提供了类似DataFrame的高级查询、管道操作等等方法。

purrr

purrr向Scala这样的具有高级类型系统的函数式编程语言学习,为data frame的操作提供更多的函数式编程方法,比如map、lambda表达式。此外,purrr引入了静态类型,来解决原生的apply函数族类型系统不稳定的情况。

我遇到过一个非常头疼的apply函数的问题:apply内的表达式计算结果不一致。

       # 原来表达式是这样的,但是返回的计算结果不对: # x1,x2,x3都是一个含有NA值的一个10x10的矩阵 apply(x1*x2-x1*x3,1,sum,na.rm=T)     

于是改成分步计算才能得到正确答案。

       t1 <- apply(x1 * x2,1,sum,na.rm=T) t2 <- apply(x1 * x3,1,sum,na.rm=T) t3 <- t1 - t2     

如果使用purrr包就可以很好的解决这一问题。参考 Wisdom's Quintessence: Purrr package for R is good for performance 的例子:

       library(purrr)   mtcars %>%   split(.$cyl) %>%   map(~ lm(mpg ~ wt, data = .)) %>%   map(summary) %>%   map_dbl("r.squared")     

具体使用可以参考Rstudio Blog:purrr 0.2.0

数据可视化 ggplot2/ggvisggplot2

ggplot2 是一个增强的数据可视化R包,帮助我们轻松创建令人惊叹的多层图形。它的设计理念类似于PhotoShop,具体参数包含设计对象、艺术渲染、统计量、尺寸调整、坐标系统、分片显示、位置调整、动画效果等等。

更多操作可以查看ggplot2与数据可视化速查表官方文档

实战可以参考R Graphics Cookbook一书

ggvis

ggvis是吸收了ggplot2vega以及d3的精华,目标旨在配合shiny打造动态可交互的可视化组件。ggvis最明显的区别就是在作图时直接支持%>%的管道操作,比如:

       diamonds %>% ggvis(~carat, ~price, fill=~clarity) %>% layer_points(opacity:=1/2)     

ggplot2与ggvis的关系类似于plyr与dplyr的关系,都是一种演化过程。

数据建模 broombroom

在机器学习的本质其实就是各种姿势的回归,而在R中的各种回归分析往往不会返回一个整齐的data frame 结果。比如

       lmfit <- lm(mpg ~ wt, mtcars) lmfit ##  ## Call: ## lm(formula = mpg ~ wt, data = mtcars) ##  ## Coefficients: ## (Intercept)           wt   ##      37.285       -5.344     

这时候broom包就派上用场了,直接将统计结果转化为data frame格式:

       library(broom) tidy(lmfit) ##          term  estimate std.error statistic      p.value ## 1 (Intercept) 37.285126  1.877627 19.857575 8.241799e-19 ## 2          wt -5.344472  0.559101 -9.559044 1.293959e-10     

augment()函数返回data frame格式的s其所有他参数结果

       head(augment(lmfit)) ##           .rownames  mpg    wt  .fitted   .se.fit     .resid       .hat    .sigma      .cooksd  .std.resid ## 1         Mazda RX4 21.0 2.620 23.28261 0.6335798 -2.2826106 0.04326896  3.067494 1.327407e-02 -0.76616765 ## 2     Mazda RX4 Wag 21.0 2.875 21.91977 0.5714319 -0.9197704 0.03519677  3.093068 1.723963e-03 -0.30743051 ## 3        Datsun 710 22.8 2.320 24.88595 0.7359177 -2.0859521 0.05837573  3.072127 1.543937e-02 -0.70575249 ## 4    Hornet 4 Drive 21.4 3.215 20.10265 0.5384424  1.2973499 0.03125017  3.088268 3.020558e-03  0.43275114 ## 5 Hornet Sportabout 18.7 3.440 18.90014 0.5526562 -0.2001440 0.03292182  3.097722 7.599578e-05 -0.06681879 ## 6           Valiant 18.1 3.460 18.79325 0.5552829 -0.6932545 0.03323551  3.095184 9.210650e-04 -0.23148309     

glance()函数,返回data frame格式的部分参数结果

       glance(lmfit) ##   r.squared adj.r.squared    sigma statistic      p.value df    logLik ## 1 0.7528328     0.7445939 3.045882  91.37533 1.293959e-10  2 -80.01471 ##        AIC      BIC deviance df.residual ## 1 166.0294 170.4266 278.3219          30     

DataFrame优化data.table

众所周知,data.frame的几个缺点有:

  1. 大数据集打印缓慢
  2. 内部搜索缓慢
  3. 语法复杂
  4. 缺乏内部的聚合操作

针对这几个问题,data.table应运而生。data.table完美兼容data.frame,这意味着之前对data.frame的操作我们可以完全保留,并且支持更多方便的数据操作方法。

data.table还参考了NoSQL中流行的Key-Value形式,引入了setkey()函数,为数据框设置关键字索引。

值得一提的是data.table引入了全新的索引形式,大大简化了data frame的分片形式,提供接近于原生矩阵的操作方式并直接利用C语言构造底层,保证操作的速度。

更多操作详情可查看data.table速查表

DataFrame可视化DT

DT包是谢溢辉老师的大作,为data frame数据提供了非常好的可视化功能,并且提供了筛选、分页、排序、搜索等数据查询操作。

       library(DT) datatable(iris)     

此外,DT包还提供了大量的UI定制的功能,对html、css和js进行深度定制。比如:

       m = matrix(c(   '<b>Bold</b>', '<em>Emphasize</em>', '<a href="http://rstudio.com">RStudio</a>',   '<a href="#" onclick="alert('Hello World');">Hello</a>' ), 2) colnames(m) = c('<span style="color:red">Column 1</span>', '<em>Column 2</em>') datatable(m)  # 默认 escape = TRUE  datatable(m, escape = FALSE)     



参考资料

作为分享主义者(sharism),本人所有互联网发布的图文均遵从CC版权,转载请保留作者信息并注明作者 Harry Zhu 的 FinanceR专栏:FinanceR - SegmentFault,如果涉及源代码请注明GitHub地址:harryprince (HarryZhu) · GitHub。微信号: harryzhustudio
商业使用请联系作者。



  

相关话题

  有哪些「神奇」的数据获取方式? 
  医疗大数据的分析和挖掘发展现状如何?未来会有什么样的应用前景? 
  什么是非独立同分布(Non-IID)数据,有没有很简单的解释方法? 
  Google 是如何从一家搜索引擎公司成长为如今这样的综合科技公司? 
  程序员年龄增大后的职业出路是什么? 
  作为程序员面试官或主管,你能容忍你面试者或下属不会盲打甚至二指禅吗? 
  如何分析找出知乎的潜在的热门问题? 
  有哪些东西组合起来有一加一大于二的效果? 
  如何看待2017 年 11 月 28 日北京警方对红黄蓝幼儿园事件「未发现有人对儿童实施侵害」的通报? 
  一个节目“百万人同时在线”是如何做到的,对后台技术有哪些要求? 

前一个讨论
火电厂在河上游,对下游的水质有污染吗?
下一个讨论
谁能用通俗的语言解释一下什么是 RPC 框架?





© 2024-09-27 - tinynew.org. All Rights Reserved.
© 2024-09-27 - tinynew.org. 保留所有权利