dplyr
是一种数据操作语法(“A Grammar of Data Manipulation”),提供了一组连贯的动词来帮助处理常见的数据操作。
- “single-table” 动词(见
vignette("dplyr")
):mutate()
adds new variables that are functions of existing variables.select()
picks variables based on their names.filter()
picks cases based on their values.summarise()
reduces multiple values down to a single summary.arrange()
changes the ordering of the rows.
- “two-table” 动词(见
vignette("two-table")
)
和 group_by()
组合使用这些函数,可以“by group”地进行任何操作。
If you are new to dplyr, the best place to start is the data transformation chapter in R for Data Science.
In addition to data frames/tibbles, dplyr makes working with other computational backends accessible and efficient. Below is a list of alternative backends:
arrow
for larger-than-memory datasets, including on remote cloud storage like AWS S3, using the Apache Arrow C++ engine, Acero.dtplyr
for large, in-memory datasets. Translates your dplyr code to high performancedata.table
code.dbplyr
for data stored in a relational database. Translates your dplyr code to SQL.duckplyr
for using duckdb on large, in-memory datasets with zero extra copies. Translates your dplyr code to high performance duckdb queries with an automatic R fallback when translation isn’t possible.duckdb
for large datasets that are still small enough to fit on your computer.sparklyr
for very large datasets stored in Apache Spark.
准备
|
|
示例数据 starwars
:
|
|
|
|
单表格动词
dplyr 旨在为数据操作的每个基础动词提供一个函数。这些动词可以根据其使用的数据集成分分为三类:
- 行:
filter()
根据列的值选择行。slice()
根据位置选择行。arrange()
更改行的顺序。
- 列:
select()
选择列。rename()
更改列名。mutate()
更改列的值并创建新列。relocate()
更改列的顺序。
- 行组(groups of rows):
summarise()
将一个组压缩为一行。
magrittr
包提供了管道操作符 %>%
。相比于 R 的原生管道操作符 |>
,%>%
使用时处理可以默认传递数据到函数的第一个参数,还可以通过 .
明确指定要传递的位置。
|
|
|
|
操纵行的单表格动词
使用 filter()
过滤行
|
|
|
|
和所有单表动词一样,filter()
的第一个参数是一个 tibble
或 data.frame
对象,后续参数会引用第一个参数中的变量。
filter()
中不能使用 select()
的帮助函数
ends_with()
、contains()
等帮助函数只能在 select()
中使用,可以用 stringr
中的函数替代:
|
|
|
|
使用 arrange()
根据列值(变量)排序行
|
|
|
|
可以同时使用多个变量排序,第一个用于排序的变量的优先级最高:
|
|
|
|
arrange()
默认是升序,使用 desc()
可降序排列:
|
|
|
|
无论是升序还是降序,NA
值都会被放在末尾:
|
|
|
|
使用 slice()
根据行的位置选择行
使用 slice()
可以选择、删除和复制行:
|
|
|
|
可以指定多个位置条件,效果就像是将多个条件合并一样:
|
|
|
|
注意相比之前的 slice(seq(1, nrow(.), 2))
,这里只少了 5 行,而不是 10 行。
其他特化的 helper 函数:
slice_head()
和slice_tail()
分别选择头、尾数行,使用n
参数指定行数。slice_sample()
随机选择数行,使用n
参数指定行数或使用prop
参数按比例指定行数。- 和
sample()
一样,可以使用replace
参数指定放回(TRUE
)或不放回(FALSE
,默认)。 - 使用
weight_by
参数可以进行加权抽样,改变行被抽中的概率。权重变量会被自动标准化以使得总和为 1(注意要先用filter()
去除NA
)。
- 和
操纵列的单表格动词
使用 select()
选择列
可以使用变量名(height
)或变量名字符串("height"
)、作为一个向量(select(c(height, "mass"))
)或作为多个参数(starwars %>% select(height, "mass")
)指定要选择的列:
|
|
|
|