数据是 R 的主要工作对象,而数据转换是进行数据处理分析的关键步骤,也是能够判断出工作者对数据分析熟练程度的指标之一。
dplyr 基础
由于 R 对数据格式具有特定的要求,而数据来源未必符合这种要求,因此需要对数据进行转换。常见的数据转换有:创建摘要统计量、重命名、排序等。tidyverse
包中主要用来处理数据转换的包是 dplyr
。
dplyr
包中常用的核心函数有:
filter
函数:按值筛选观测arrange
函数:对行重新排序select
函数:按名称选取变量mutate
函数:使用现有变量的函数创建新变量summarize
函数:将多个值总结为一个摘要统计量
这些函数都遵循以下行为:
- 第一参数是一个数据框
- 随后的参数是变量名称
- 输出结果是一个新数据框,并且默认不会修改原数据框
此外,还存在一个 group_by
函数可以与上面的函数联合使用,通过改变其作用范围以达到分组操作。
筛选行
filter
函数的语法为:filter(.data, ...)
。其中 .data
为数据集,...
为返回逻辑值的判断式,可以使用的筛选函数有:
==
,>
,>=
等&
,|
,!
,xor()
is.na()
between()
,near()
near 函数可以用来判断浮点数是否相等,因为使用 == 判断浮点数是否相等时经常会判断错误,而该现象是由浮点数储存方式导致的
排列行
arrange
函数的语法为:arrange(.data, ...)
。其中 .data
为数据集,...
为排序依据的列名。
列名的数量可以有多个,并且默认排序方式为升序,在有多个列名的情况下,后面的列会在前面的列排序的基础上继续排序,可以在列名外包裹 desc() 函数来使用降序排序
缺失值 NA 总是排在最后
选择列
select
函数的语法为:select(.data, ...)
。其中 .data
为数据集,...
为需要提取的列的名称。
列名可以是单列,也可以是逗号隔开的多列,甚至可以是支持索引系统的向量
此外,该函数还支持许多辅助函数:
函数 | 示例 | 作用 |
---|---|---|
starts_with | starts_with(“fgh”) | 匹配以“ fgh ”开头的列名 |
ends_with | ends_with(“lmn”) | 匹配以“ lmn ”结尾的列名 |
contains | contains(“ijk”) | 匹配包含“ ijk ”的列名 |
matches | 匹配正则表达式的列名 | |
num_range | num_range(“x”, 1:3) | 匹配 x1,x2 和 x3 |
虽然 select 函数可以重命名变量,但还是推荐使用 rename 函数来完成该工作
select 函数有一个选取全部列的函数 everything ,虽然该函数看起来并没有什么具体作用,但如果想将关注的列排到最前而其他列依然保留,那么在列出关注的列的名称后使用该辅助函数就可以达成目的
select 函数并不会改变原数据集的内容,因此需要根据具体情况将该函数的值返回给新对象或原数据集
添加新变量
mutate
函数的语法为 mutate(.data, ...)
。其中 .data
为数据集,...
为新建列的名称,用 变量名 = 表达式
的方式进行初始化。
该函数并不会创建新的数据集,并且可以新加多列
如果只想保留新变量,可以使用 transmute 函数代替 mutate 函数。同样地,该函数也不会创建新的数据集
常用的创建函数如下:
算术运算符
名称 | 作用 |
---|---|
+ | 加法 |
- | 减法 |
* | 乘法 |
/ | 除法 |
^ | 乘幂 |
模运算符
名称 | 作用 |
---|---|
%/% | 整数除法 |
%% | 求余 |
对数函数
名称 | 作用 |
---|---|
log() | 以 e 为底数的对数函数 |
log2() | 以 2 为底数的对数函数 |
log10() | 以 10 为底数的对数函数 |
偏移函数
名称 | 作用 |
---|---|
lead() | 返回序列的领先值 |
lag() | 返回序列的滞后值 |
累加和滚动聚合
名称 | 作用 |
---|---|
cumsum | 累加总和 |
cummean | 累加均值 |
逻辑比较
名称 | 作用 |
---|---|
< | 小于 |
> | 大于 |
<= | 小于等于 |
>= | 大于等于 |
== | 等于 |
!= | 不等于 |
排秩
名称 | 作用 |
---|---|
min_rank() | 按值排秩 |
min_rank(desc()) | 按值逆序排秩 |
分组摘要
summarize
函数的语法为 summarize(.data, ..., .groups = NULL)
。其中 .data
为数据集,...
为保留列或新建列。
通常将该函数与 group_by
函数结合使用,以达到分组的目的。
管道组合
管道组合相当于连续处理,符号 %>%
用来表示管道。以下三个语句的作用是一致的:
1 | > x %>% f(y) %>% g(z) |
缺失值
由于数据集中经常会出现 NA 值,因此对于数据处理函数需要经常附带参数 na.rm = TRUE
来删除其中的缺失值。
常用的摘要函数
位置度量
名称 | 作用 |
---|---|
mean(x) | x 的均值 |
median(x) | x 的中位数 |
分散程度度量
名称 | 作用 |
---|---|
sd(x) | x 的均方误差 |
IQR(x) | x 的四分位距 |
mad(x) | x 的绝对中位差 |
秩的度量
名称 | 作用 |
---|---|
min(x) | x 的最小值 |
quantile(x, 0.25) | x 的第一四分位数(较小四分位数) |
max(x) | x 的最大值 |
quantile 函数的第二参数可以是区间 [0, 1] 中的任意值
定位度量
名称 | 作用 |
---|---|
first(x) | x 的首元素 |
nth(x,2) | x 的第二元素 |
last(x) | x 的末元素 |
nth 函数的第二参数可以是数据集可用的整数索引
计数
名称 | 作用 |
---|---|
n() | 返回当前分组的大小 |
sum(!is.na(x)) | 返回 x 非缺失值的数量 |
n_distinct(x) | 返回 x 唯一值的数量 |
count(x) | 返回 x 变量对应取值的数量 |
count 还可以指定参数 wt 来计算对应变量的和
逻辑值的计数和比例
当 x 为逻辑型向量时,有
名称 | 作用 |
---|---|
sum(x) | x 中 TRUE 的数量 |
mean(x) | x 中 TRUE 的比例 |
按多个变量分组
可以使用 group_by
函数给数据集分组,例如 group_by(x, a, b, c, ...)
会生成一个以变量 a ,b ,c ,… 分组的数据集(即在原数据集基础上生成具有分组的新数据集)。
summarize
函数的第一参数通常是一个已分组的数据集。在这种情况下,会生成一个摘要数据集,摘要数据集是一个新的分组数据集,并且其分组与原数据集的分组在顺序上一致,数量上少一个(少的是分组内的最后一个变量)。
对摘要数据集再次使用 summarize 函数时,会在该数据集的分组基础上再删除掉最后的变量,并生成新的摘要数据集
summarize
函数还可以包含其他参数,这时这些参数会生成新的列。
summarize 函数只会保留分组变量的列(根据情况可能还会缩进掉分组的最后一个变量),因此每次使用此函数时都要对其它的保留列做额外处理
取消分组
可以使用 ungroup
函数生成一个取消已分组数据集分组的数据集。
分组新变量(或筛选器)
mutate
和 filter
函数和 summarize
函数一样,也可以作用于分组数据集。
分组操作和添加新变量(或筛选器)的前后顺序不一样,结果也可能会不一样