5  数据操作

目前, R 语言在数据操作方面陆续出现三套工具,最早的是 Base R(1997 年 4月),之后是 data.table(2006年4月) 和 dplyr(2014 年1月)。下面将从世界银行下载的原始数据开始,以各种数据操作及其组合串联起来介绍,完成数据探查的工作。

5.1 操作工具

本节所用数据来自世界银行,介绍 Base R、data.tabledplyr 的简介、特点、对比

5.1.1 Base R

在 data.frame 的基础上,提供一系列辅助函数实现各类数据操作。

aggregate(iris, Sepal.Length ~ Species, FUN = length)
     Species Sepal.Length
1     setosa           50
2 versicolor           50
3  virginica           50

5.1.2 data.table

data.table 包在 Base R 的基础上,扩展和加强了原有函数的功能,提供一套完整的链式操作语法。

library(data.table)
iris_dt <- as.data.table(iris)
iris_dt[ ,.(cnt = length(Sepal.Length)) , by = "Species"]
      Species cnt
1:     setosa  50
2: versicolor  50
3:  virginica  50

5.1.3 dplyr

dplyr 包提供一套全新的数据操作语法,与 purrr 包和 tidyr 包一起形成完备的数据操作功能。在 R 环境下,dplyr 包提供一套等价的表示,代码如下:

iris |> 
  dplyr::group_by(Species) |> 
  dplyr::count()
# A tibble: 3 × 2
# Groups:   Species [3]
  Species        n
  <fct>      <int>
1 setosa        50
2 versicolor    50
3 virginica     50

5.1.4 SQL

实际工作中,SQL (结构化查询语言)是必不可少的基础性工具,比如 SQLiteHiveSpark 等都提供基于 SQL 的数据查询引擎,没有重点介绍 SQL 操作是因为本书以 R 语言为数据分析的主要工具,而不是它不重要。以 dplyr 来说吧,它的诸多语义动词就是对标 SQL 的。

library(DBI)
conn <- DBI::dbConnect(RSQLite::SQLite(),
  dbname = system.file("db", "datasets.sqlite", package = "RSQLite")
)

按 Species 分组统计数据条数, SQL 查询语句如下:

SELECT COUNT(1) AS cnt, Species
FROM iris
GROUP BY Species;

SQL 代码执行的结果如下:

iris_preview
  cnt    Species
1  50     setosa
2  50 versicolor
3  50  virginica

dplyr 包能连接数据库,以上 SQL 代码也可以翻译成等价的 dplyr 语句。

dplyr::tbl(conn, "iris") |> 
  dplyr::group_by(Species) |> 
  dplyr::count()
# Source:   SQL [3 x 2]
# Database: sqlite 3.41.2 [/usr/local/lib/R/library/RSQLite/db/datasets.sqlite]
# Groups:   Species
  Species        n
  <chr>      <int>
1 setosa        50
2 versicolor    50
3 virginica     50

dplyr 包的函数 show_query() 可以将 dplyr 语句转化为查询语句,这有助于排错。

dplyr::tbl(conn, "iris") |> 
  dplyr::group_by(Species) |> 
  dplyr::count() |> 
  dplyr::show_query()
<SQL>
SELECT `Species`, COUNT(*) AS `n`
FROM `iris`
GROUP BY `Species`

glue 包可以使用 R 环境中的变量,相比于 sprintf() 函数,可以组合更大型的 SQL 语句,这在生产环境中广泛使用。

# R 环境中的变量
group <- "Species"
# 组合 SQL
query <- glue::glue("
  SELECT COUNT(1) AS cnt, Species
  FROM iris
  GROUP BY ({group})
")
# 将 SQL 语句传递给数据库,执行 SQL 语句
DBI::dbGetQuery(conn, query)
  cnt    Species
1  50     setosa
2  50 versicolor
3  50  virginica

用完后,关闭连接通道。

dbDisconnect(conn = conn)

更多关于 SQL 语句的使用介绍见书籍《Become a SELECT star》

5.2 Base R 操作

介绍最核心的 Base R 数据操作,如筛选、排序、变换、聚合、重塑等

5.2.1 筛选

subset / [

5.2.2 变换

最常见的变换操作是类型转化,比如从字符串型转为因子型、整型或日期型等。

within/transform

5.2.3 排序

order

5.2.4 聚合

aggregate

5.2.5 合并

merge

5.2.6 重塑

reshape

分组 split / lapply / do.call / Reduce

5.3 data.table 操作

掌握此等基础性的工具,再去了解新工具也不难,更重要的是,只要将一种工具掌握的足够好,也就足以应付绝大多数的情况。

  1. 介绍 data.table 基础语法,对标 Base R,介绍基础操作,同时给出等价的 dplyr 实现,但不运行代码。

  2. data.table 扩展 Base R 数据操作,介绍常用的操作 8 个,讲清楚出现的具体场景,同时给出等价的 dplyr 实现,但不运行代码。

  3. data.table 特有的高级数据操作 on .SD .I .J 等。

5.3.1 筛选

[

5.3.2 变换

:

5.3.3 排序

5.3.4 聚合

5.3.5 重塑

5.3.6 合并