第 6 章 数据操作

data.table 诞生于2006年4月15日(以在 CRAN 上发布的第一个版本时间为准),是基于 data.frame 的扩展和 Base R 的数据操作连贯一些,dplyr 诞生于2014年1月29日,号称数据操作的语法,其实二者套路一致,都是借用 SQL 语言的设计,实现方式不同罢了,前者主要依靠 C 语言完成底层数据操作,总代码量1.29M,C 占65.6%,后者主要依靠 C++ 语言完成底层数据操作,总代码量1.2M,C++ 占34.4%,上层的高级操作接口都是 R 语言。像这样的大神在写代码,码力应该差不多,编程语言会对数据操作的性能有比较大的影响,我想这也是为什么在很多场合下 data.table 霸榜!

关于 data.table 和 dplyr 的对比,参看爆栈网的帖子 https://stackoverflow.com/questions/21435339

学习 data.table 包最快的方式就是在 R 控制台运行 example(data.table) 并研究其输出。

data.table 大大加强了 Base R 提供的数据操作,poorman 提供最常用的数据操作,但是不依赖 dplyr,fstarrowfeather 提供更加高效的数据读写性能。

collapse 提供一系列高级和快速的数据操作,支持 Base R、dplyr、tibble、data.table、plm 和 sf 数据框结构类型。关键的特点有:1. 高级的统计编程,提供一系列统计函数支持在向量、矩阵和数据框上做分组和带权计算。fastverse 提供丰富的数据操作和统计计算功能,意图打造一个 tidyverse 替代品。

更多参考材料见A data.table and dplyr tourBig Data in Economics: Data cleaning and wranglingDataCamp’s data.table cheatsheet,关于采用 Base R 还是 tidyverse 做数据操作的 讨论,数据操作的动画展示参考 https://github.com/gadenbuie/tidyexplain

Tidyverse 和 Base R 的关系

图 6.1: Tidyverse 和 Base R 的关系

什么是 Base R? Base R 指的是 R 语言/软件的核心组件,由 R Core Team 维护

Pkgs <- sapply(list.files(R.home("library")), function(x)
  packageDescription(pkg = x, fields = "Priority"))
names(Pkgs[Pkgs == "base" & !is.na(Pkgs)])
##  [1] "base"      "compiler"  "datasets"  "graphics"  "grDevices" "grid"     
##  [7] "methods"   "parallel"  "splines"   "stats"     "stats4"    "tcltk"    
## [13] "tools"     "utils"
names(Pkgs[Pkgs == "recommended" & !is.na(Pkgs)])
##  [1] "boot"       "class"      "cluster"    "codetools"  "foreign"   
##  [6] "KernSmooth" "lattice"    "MASS"       "Matrix"     "mgcv"      
## [11] "nlme"       "nnet"       "rpart"      "spatial"    "survival"

数据变形,分组统计聚合等,用以作为模型的输入,绘图的对象,操作的数据对象是数据框(data.frame)类型的,而且如果没有特别说明,文中出现的数据集都是 Base R 内置的,第三方 R 包或者来源于网上的数据集都会加以说明。

# 给定一个/些 R 包名,返回该 R 包存放的位置
sapply(.libPaths(), function(pkg_path) {
  c("survival", "ggplot2") %in% .packages(T, lib.loc = pkg_path)
})
##      /home/runner/work/_temp/Library /opt/R/4.2.3/lib/R/site-library
## [1,]                           FALSE                           FALSE
## [2,]                            TRUE                           FALSE
##      /opt/R/4.2.3/lib/R/library
## [1,]                       TRUE
## [2,]                      FALSE