参考前文 数据流编程教程:R语言与非结构化数据共舞,我们知道,区别于dplyr包,rlist包是针对非结构化数据处理而生的,也对以list为核心的数据结构提供了类似DataFrame的高级查询、管道操作等等方法。
purrrpurrr向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/ggvis ggplot2ggplot2 是一个增强的数据可视化R包,帮助我们轻松创建令人惊叹的多层图形。它的设计理念类似于PhotoShop,具体参数包含设计对象、艺术渲染、统计量、尺寸调整、坐标系统、分片显示、位置调整、动画效果等等。
更多操作可以查看ggplot2与数据可视化速查表 和 官方文档
实战可以参考R Graphics Cookbook一书。
ggvisggvis是吸收了ggplot2、vega以及d3的精华,目标旨在配合shiny打造动态可交互的可视化组件。ggvis最明显的区别就是在作图时直接支持%>%的管道操作,比如:
diamonds %>% ggvis(~carat, ~price, fill=~clarity) %>% layer_points(opacity:=1/2)ggplot2与ggvis的关系类似于plyr与dplyr的关系,都是一种演化过程。
数据建模 broom broom在机器学习的本质其实就是各种姿势的回归,而在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-10augment()函数返回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.23148309glance()函数,返回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的几个缺点有:
大数据集打印缓慢
内部搜索缓慢
语法复杂
缺乏内部的聚合操作
针对这几个问题,data.table应运而生。data.table完美兼容data.frame,这意味着之前对data.frame的操作我们可以完全保留,并且支持更多方便的数据操作方法。
data.table还参考了NoSQL中流行的Key-Value形式,引入了setkey()函数,为数据框设置关键字索引。