数据处理主要内容包括:
- 1. 特殊值处理
- 1.1 缺失值
- 1.2 离群值
- 1.3 日期
- 2. 数据转换(base vs. dplyr)
- 2.1 筛选(subset vs. filter/select/rename)
- 2.2 排序(order vs. arrange)
- 2.3 转换(transform vs. mutate/transmute)
- 2.4 分组与概括(group_by/summarise)
- 3. 数据框重塑(base vs. dplyr)
- 3.1 数据框的合并(rbind/cbind vs. bind_rows/bind_cols)
- 3.2 数据框的关联(merge vs. *_ join)
- 3.3 数据框的长宽转换(reshape2 包)
本文我们学习数据框重塑的有关内容。前文链接:
Sub-woo:R语言笔记(四):数据处理(上)zhuanlan.zhihu.com有出错或补充的地方请大神们不吝赐教,作者会持续更新!
3. 数据框重塑
这篇文章我们主要介绍基本包和 dplyr 包中用于数据框操作的函数,包括多个数据框的合并、关联以及长宽数据框的转换。
字符串的拼接可以通过 paste() 函数实现,而多个数据框也同样可以通过函数合成为一个数据框。与字符串不同的是,多个数据框的合成方式有两种,一种是合并(父母之命,媒妁之言),另一种是关联(相信缘分,因为爱情)。以下是段子,没兴趣的小伙伴可以跳过。
【段子:如何理解合并是“父母之命,媒妁之言”?这几个要合并的数据框往往没有相同的行或者列,我们只想硬生生地把它们拼成一个整体而已,或者说它们在一起不是因为相互有什么相同点,只是因为我们(父母)想[doge]。】
【段子:那又如何理解关联是“因为爱情”呢?需要关联的数据框往往具有某些相同的行或者列,比如有两份数据框,一份是小明和小红的数学成绩,另一份是小明和小红的英语成绩,很显然两份数据框都有相同的人名,因此我们就可以将二者关联,形成一份体现小明和小红数学、英语成绩的成绩单。这些相同的行或列就好比缘分和爱情,正因为有了共同点,数据框们才能更紧密地结合,更幸福地生活=。=】
3.1 数据框的合并(rbind/cbind vs. bind_rows/bind_cols)
- base 包(rbind/cbind)
base 包提供的实现合并的函数有两个,分别是:
rbind()
# 纵向合并
cbind()
# 横向合并
【注】rbind() 要求数据框的列数相同,同时列名也要一致;cbind() 要求数据框的行数相同。举几个例子:
set1 <- data.frame(a = 1: 4, b = LETTERS[1: 4])
set2 <- data.frame(a = 0, b = c("I", "love", "u"), c = c(5, 2, 0))
set1 # 4×2 的数据框
# a b
# 1 1 A
# 2 2 B
# 3 3 C
# 4 4 D
set2 # 3×3 的数据框
# a b c
# 1 0 I 5
# 2 0 love 2
# 3 0 u 0
# rbind(set1, set2) 列数不相同会报错
# cbind(set1, set2) 行数不相同会报错
rbind(set1, set2[, 1:3]) # 只取 set2 的前两列,使得列数与 set1 相同
# a b
# 1 1 A
# 2 2 B
# 3 3 C
# 4 4 D
# 5 0 I
# 6 0 love
# 7 0 u
cbind(set1[1: 3, ], set2) # 只取 set1 的前三行,使得行数与 set2 相同
a b a b c
1 1 A 0 I 5
2 2 B 0 love 2
3 3 C 0 u 0
# 合并出现了两个 a 列
【注】使用 cbind() 合并数据框后,可能出现列名相同的情况,某种程度上算是 cbind() 的缺陷,因此作者也更倾向于使用 dplyr 包提供的合并函数。
- dplyr 包(bind_rows/bind_cols)
dplyr 包提供的数据框合并函数也有两个,分别是:
bind_rows()
# 纵向拼接
bind_cols()
# 横向拼接
【注】bind_rows() 根据列名对数据框进行合并,同一列名的列进行合并,不同列名的列会自动进行补齐&