R语言开卷考试复习:数据管理与绘图

Author

蟹蟹喵

Published

June 8, 2026

一、考前准备

1. 加载 R 包

本资料使用以下 R 包,和考试要求保持一致。

library(ggplot2)
library(dplyr)
library(corrgram)
library(GGally)
library(vcd)

2. 准备示例数据

这里使用一份简单的学生成绩数据。
后面所有数据管理和绘图都围绕这份数据展开。

student <- data.frame(
  id = 1:20,
  name = paste0("学生", 1:20),
  class = c("一班","一班","一班","一班","一班",
            "二班","二班","二班","二班","二班",
            "三班","三班","三班","三班","三班",
            "四班","四班","四班","四班","四班"),
  gender = c("男","女","女","男","女",
             "男","女","男","女","男",
             "女","男","女","男","女",
             "男","女","男","女","男"),
  exam_date = c("2024-03-01","2024-03-01","2024-03-02","2024-03-02","2024-03-03",
                "2024-03-01","2024-03-02","2024-03-02","2024-03-03","2024-03-03",
                "2024-03-01","2024-03-01","2024-03-02","2024-03-03","2024-03-03",
                "2024-03-01","2024-03-02","2024-03-02","2024-03-03","2024-03-03"),
  chinese = c(88,92,75,81,95,70,84,79,91,73,86,80,94,76,89,82,90,78,85,72),
  math = c(90,85,78,88,96,74,82,80,93,70,89,77,95,75,91,84,88,79,86,73),
  english = c(86,94,80,83,97,72,85,81,90,76,88,79,96,78,87,80,92,77,84,75),
  study_hours = c(3.5,4.2,2.0,3.0,5.0,1.8,3.2,2.5,4.8,2.0,
                  3.8,2.7,5.2,2.1,4.0,3.0,4.5,2.4,3.6,1.9),
  sleep_hours = c(7.5,7.0,8.0,7.2,6.8,8.3,7.4,7.8,6.9,8.1,
                  7.1,7.6,6.7,8.2,7.0,7.5,6.9,7.9,7.3,8.0),
  height = c(170,162,158,175,160,172,165,174,161,176,
             159,171,163,173,160,177,164,175,162,178),
  weight = c(65,52,50,70,51,68,55,72,53,75,
             49,66,54,71,52,76,56,73,55,78)
)

head(student)
  id  name class gender  exam_date chinese math english study_hours sleep_hours
1  1 学生1  一班     男 2024-03-01      88   90      86         3.5         7.5
2  2 学生2  一班     女 2024-03-01      92   85      94         4.2         7.0
3  3 学生3  一班     女 2024-03-02      75   78      80         2.0         8.0
4  4 学生4  一班     男 2024-03-02      81   88      83         3.0         7.2
5  5 学生5  一班     女 2024-03-03      95   96      97         5.0         6.8
6  6 学生6  二班     男 2024-03-01      70   74      72         1.8         8.3
  height weight
1    170     65
2    162     52
3    158     50
4    175     70
5    160     51
6    172     68

二、数据管理考点

1. 日期值

考点说明

日期值常考:

  1. 把字符型日期转成日期型;
  2. 使用 format = 指定日期格式;
  3. 区分 %Y%y
  4. 提取年、月、日;
  5. format() 改变日期显示方式。

日期格式符号

格式符号 含义 示例
%Y 四位年份 2024
%y 两位年份 24
%m 两位月份 03
%d 两位日期 01
%B 完整月份名称 March
%b 缩写月份名称 Mar
%A 完整星期名称 Friday
%a 缩写星期名称 Fri

注意:

  • %Y 是四位年份,例如 2024
  • %y 是两位年份,例如 24
  • %m 是月份;
  • %d 是日期;
  • %B%b%A%a 的显示结果可能受电脑系统语言影响。

示例:日期转换和日期提取

student <- student %>%
  mutate(
    exam_date = as.Date(exam_date, format = "%Y-%m-%d"),
    exam_year = format(exam_date, "%Y"),
    exam_month = format(exam_date, "%m"),
    exam_day = format(exam_date, "%d"),
    exam_weekday = format(exam_date, "%A"),
    year_month = format(exam_date, "%Y-%m")
  )

head(student)
  id  name class gender  exam_date chinese math english study_hours sleep_hours
1  1 学生1  一班     男 2024-03-01      88   90      86         3.5         7.5
2  2 学生2  一班     女 2024-03-01      92   85      94         4.2         7.0
3  3 学生3  一班     女 2024-03-02      75   78      80         2.0         8.0
4  4 学生4  一班     男 2024-03-02      81   88      83         3.0         7.2
5  5 学生5  一班     女 2024-03-03      95   96      97         5.0         6.8
6  6 学生6  二班     男 2024-03-01      70   74      72         1.8         8.3
  height weight exam_year exam_month exam_day exam_weekday year_month
1    170     65      2024         03       01       星期五    2024-03
2    162     52      2024         03       01       星期五    2024-03
3    158     50      2024         03       02       星期六    2024-03
4    175     70      2024         03       02       星期六    2024-03
5    160     51      2024         03       03       星期日    2024-03
6    172     68      2024         03       01       星期五    2024-03

考点核心参数说明

写法 作用
as.Date(x, format = "%Y-%m-%d") 把字符型日期转成日期型
format = "%Y-%m-%d" 原数据是“年-月-日”
format = "%y-%m-%d" 原数据是“两位年-月-日”
format(date, "%Y") 提取四位年份
format(date, "%m") 提取月份
format(date, "%d") 提取日期
format(date, "%A") 提取完整星期名称
format(date, "%Y-%m") 生成年月变量

2. 因子

考点说明

因子用于处理分类变量。
比如:

  • 班级;
  • 性别;
  • 成绩等级。

如果分类变量有顺序,比如“不及格、及格、良好、优秀”,就应该设置为有序因子。

student <- student %>%
  mutate(
    class = factor(class, levels = c("一班", "二班", "三班", "四班")),
    gender = factor(gender),
    total = chinese + math + english,
    average = round(total / 3, 1),
    level = case_when(
      average >= 90 ~ "优秀",
      average >= 80 ~ "良好",
      average >= 70 ~ "及格",
      TRUE ~ "不及格"
    ),
    level = factor(level, levels = c("不及格", "及格", "良好", "优秀"), ordered = TRUE)
  )

head(student)
  id  name class gender  exam_date chinese math english study_hours sleep_hours
1  1 学生1  一班     男 2024-03-01      88   90      86         3.5         7.5
2  2 学生2  一班     女 2024-03-01      92   85      94         4.2         7.0
3  3 学生3  一班     女 2024-03-02      75   78      80         2.0         8.0
4  4 学生4  一班     男 2024-03-02      81   88      83         3.0         7.2
5  5 学生5  一班     女 2024-03-03      95   96      97         5.0         6.8
6  6 学生6  二班     男 2024-03-01      70   74      72         1.8         8.3
  height weight exam_year exam_month exam_day exam_weekday year_month total
1    170     65      2024         03       01       星期五    2024-03   264
2    162     52      2024         03       01       星期五    2024-03   271
3    158     50      2024         03       02       星期六    2024-03   233
4    175     70      2024         03       02       星期六    2024-03   252
5    160     51      2024         03       03       星期日    2024-03   288
6    172     68      2024         03       01       星期五    2024-03   216
  average level
1    88.0  良好
2    90.3  优秀
3    77.7  及格
4    84.0  良好
5    96.0  优秀
6    72.0  及格

考点核心参数说明

写法 作用
factor(x) 把变量转成因子
levels = c(...) 指定因子顺序
ordered = TRUE 设置为有序因子
case_when() 根据条件生成分类变量
levels(x) 查看因子水平

3. 排序

考点说明

排序常考:

  1. 按成绩从高到低;
  2. 按成绩从低到高;
  3. 先按班级排序,再按成绩排序。
student %>%
  arrange(desc(average)) %>%
  head()
  id   name class gender  exam_date chinese math english study_hours
1  5  学生5  一班     女 2024-03-03      95   96      97         5.0
2 13 学生13  三班     女 2024-03-02      94   95      96         5.2
3  9  学生9  二班     女 2024-03-03      91   93      90         4.8
4  2  学生2  一班     女 2024-03-01      92   85      94         4.2
5 17 学生17  四班     女 2024-03-02      90   88      92         4.5
6 15 学生15  三班     女 2024-03-03      89   91      87         4.0
  sleep_hours height weight exam_year exam_month exam_day exam_weekday
1         6.8    160     51      2024         03       03       星期日
2         6.7    163     54      2024         03       02       星期六
3         6.9    161     53      2024         03       03       星期日
4         7.0    162     52      2024         03       01       星期五
5         6.9    164     56      2024         03       02       星期六
6         7.0    160     52      2024         03       03       星期日
  year_month total average level
1    2024-03   288    96.0  优秀
2    2024-03   285    95.0  优秀
3    2024-03   274    91.3  优秀
4    2024-03   271    90.3  优秀
5    2024-03   270    90.0  优秀
6    2024-03   267    89.0  良好

考点核心参数说明

写法 作用
arrange(x) x 升序排列
arrange(desc(x)) x 降序排列
arrange(group, desc(x)) 先按分组排,再按 x 降序排

4. 计算变量

考点说明

计算变量就是根据已有变量生成新变量。

本例中:

  • total:总分;
  • average:平均分;
  • bmi:BMI;
  • pass:是否通过。
student <- student %>%
  mutate(
    total = chinese + math + english,
    average = round(total / 3, 1),
    bmi = round(weight / (height / 100)^2, 1),
    pass = ifelse(average >= 60, "通过", "未通过")
  )

head(student)
  id  name class gender  exam_date chinese math english study_hours sleep_hours
1  1 学生1  一班     男 2024-03-01      88   90      86         3.5         7.5
2  2 学生2  一班     女 2024-03-01      92   85      94         4.2         7.0
3  3 学生3  一班     女 2024-03-02      75   78      80         2.0         8.0
4  4 学生4  一班     男 2024-03-02      81   88      83         3.0         7.2
5  5 学生5  一班     女 2024-03-03      95   96      97         5.0         6.8
6  6 学生6  二班     男 2024-03-01      70   74      72         1.8         8.3
  height weight exam_year exam_month exam_day exam_weekday year_month total
1    170     65      2024         03       01       星期五    2024-03   264
2    162     52      2024         03       01       星期五    2024-03   271
3    158     50      2024         03       02       星期六    2024-03   233
4    175     70      2024         03       02       星期六    2024-03   252
5    160     51      2024         03       03       星期日    2024-03   288
6    172     68      2024         03       01       星期五    2024-03   216
  average level  bmi pass
1    88.0  良好 22.5 通过
2    90.3  优秀 19.8 通过
3    77.7  及格 20.0 通过
4    84.0  良好 22.9 通过
5    96.0  优秀 19.9 通过
6    72.0  及格 23.0 通过

考点核心参数说明

写法 作用
mutate() 新增或修改变量
new = x + y 根据已有变量计算新变量
round(x, 1) 保留 1 位小数
ifelse(条件, A, B) 二分类条件判断
case_when() 多条件分类判断

5. 分组汇总

考点说明

分组汇总经常和绘图一起考。
比如先算每个班平均成绩,再画条形图。

class_mean <- student %>%
  group_by(class) %>%
  summarise(
    mean_average = mean(average),
    n = n(),
    .groups = "drop"
  )

class_mean
# A tibble: 4 × 3
  class mean_average     n
  <fct>        <dbl> <int>
1 一班          87.2     5
2 二班          80       5
3 三班          85.3     5
4 四班          81.7     5

考点核心参数说明

写法 作用
group_by(group) 按某变量分组
summarise() 对每组进行汇总
mean(x) 计算均值
sum(x) 计算总和
n() 统计每组数量
.groups = "drop" 汇总后取消分组

三、绘图考点

1. 均值条形图

考点说明

均值条形图常考两个步骤:

  1. 先计算每组均值;
  2. 再用 geom_col() 画条形图。

本例:比较四个班的平均成绩。

class_mean <- student %>%
  group_by(class) %>%
  summarise(
    mean_average = mean(average),
    .groups = "drop"
  )

ggplot(class_mean, aes(x = class, y = mean_average, fill = class)) +
  geom_col() +
  labs(
    title = "不同班级的平均成绩",
    x = "班级",
    y = "平均成绩"
  ) +
  theme_minimal()

考点核心参数说明

参数或函数 作用
group_by(class) 按班级分组
summarise(mean_average = mean(average)) 计算每班平均成绩
.groups = "drop" 汇总后取消分组,避免后续操作继续受到分组影响
aes(x = class, y = mean_average) 设置横轴和纵轴
fill = class 按班级填充颜色
geom_col() 画条形图,柱高来自数据中的 y 值

2. 直方图 + 核密度曲线

考点说明

直方图和核密度曲线用于查看连续变量的分布。
本例:查看学生平均成绩集中在哪些区间。

ggplot(student, aes(x = average)) +
  geom_histogram(
    aes(y = after_stat(density)),
    bins = 8,
    fill = "skyblue",
    color = "white"
  ) +
  geom_density(color = "red", linewidth = 1) +
  labs(
    title = "学生平均成绩分布",
    x = "平均成绩",
    y = "密度"
  ) +
  theme_minimal()

考点核心参数说明

参数或函数 作用
aes(x = average) 指定要看分布的变量
geom_histogram() 画直方图
bins = 8 设置分组数量
aes(y = after_stat(density)) 把直方图转换为密度尺度
geom_density() 添加核密度曲线

3. 盒形图 + 小提琴图

考点说明

盒形图和小提琴图用于比较不同组的数值分布。

  • 小提琴图看整体分布形状;
  • 盒形图看中位数、四分位数和异常值。

本例:比较不同班级的平均成绩分布。

ggplot(student, aes(x = class, y = average, fill = class)) +
  geom_violin(alpha = 0.6) +
  geom_boxplot(width = 0.15, fill = "white") +
  labs(
    title = "不同班级平均成绩分布",
    x = "班级",
    y = "平均成绩"
  ) +
  theme_minimal()

考点核心参数说明

参数或函数 作用
aes(x = class, y = average) 按班级比较平均成绩
geom_violin() 画小提琴图
geom_boxplot() 叠加盒形图
alpha = 0.6 设置透明度
width = 0.15 控制盒形图宽度

4. 分组条形图 + 标注

考点说明

分组条形图用于比较两个分类变量组合后的数量。
本例:比较不同班级的男女人数,并加上数字标注。

gender_count <- student %>%
  group_by(class, gender) %>%
  summarise(
    count = n(),
    .groups = "drop"
  )

ggplot(gender_count, aes(x = class, y = count, fill = gender)) +
  geom_col(position = position_dodge(width = 0.8)) +
  geom_text(
    aes(label = count),
    position = position_dodge(width = 0.8),
    vjust = -0.3
  ) +
  labs(
    title = "不同班级男女生人数",
    x = "班级",
    y = "人数",
    fill = "性别"
  ) +
  theme_minimal()

考点核心参数说明

参数或函数 作用
group_by(class, gender) 按班级和性别分组
count = n() 统计每组人数
fill = gender 按性别填充颜色
position_dodge() 让分组柱子并排显示
geom_text(aes(label = count)) 添加数字标注
vjust = -0.3 控制文字在柱子上方

5. 气泡图

考点说明

气泡图是散点图的扩展。

  • x 轴:一个连续变量;
  • y 轴:一个连续变量;
  • size:用点大小表示第三个变量;
  • color:用颜色表示分组变量。

本例:

  • x:学习时长;
  • y:平均成绩;
  • 气泡大小:总分;
  • 颜色:班级。
ggplot(student, aes(x = study_hours, y = average, size = total, color = class)) +
  geom_point(alpha = 0.7) +
  labs(
    title = "学习时长、平均成绩和总分的气泡图",
    x = "每天学习时长",
    y = "平均成绩",
    size = "总分",
    color = "班级"
  ) +
  theme_minimal()

考点核心参数说明

参数或函数 作用
x = study_hours 横轴是学习时长
y = average 纵轴是平均成绩
size = total 点大小表示总分
color = class 颜色表示班级
alpha = 0.7 设置透明度

6. 散点图矩阵

考点说明

散点图矩阵用于同时查看多个连续变量之间的关系。
这里使用考试要求中的 GGally 包。

ggpairs(
  student[, c("chinese", "math", "english", "average")]
)

考点核心参数说明

参数或函数 作用
ggpairs() 画散点图矩阵
student[, c(...)] 选择多个数值变量
对角线 显示单个变量分布
非对角线 显示两个变量之间关系

7. 分组散点图

考点说明

分组散点图用于查看两个连续变量之间的关系,同时用颜色或形状区分分组。

本例:

  • x:学习时长;
  • y:平均成绩;
  • color:班级;
  • shape:性别。
ggplot(student, aes(x = study_hours, y = average, color = class, shape = gender)) +
  geom_point(size = 3) +
  labs(
    title = "学习时长与平均成绩的关系",
    x = "每天学习时长",
    y = "平均成绩",
    color = "班级",
    shape = "性别"
  ) +
  theme_minimal()

考点核心参数说明

参数或函数 作用
x = study_hours 横轴变量
y = average 纵轴变量
color = class 用颜色区分班级
shape = gender 用点形状区分性别
geom_point() 画散点图

8. 相关图

考点说明

相关图用于展示多个数值变量之间的相关关系。
这里使用考试要求中的 corrgram 包。

相关系数含义:

  • 接近 1:正相关强;
  • 接近 -1:负相关强;
  • 接近 0:相关弱。
corrgram(
  student[, c("study_hours", "sleep_hours", "average", "bmi")],
  order = TRUE,
  lower.panel = panel.shade,
  upper.panel = panel.pie,
  text.panel = panel.txt,
  main = "学生变量相关图"
)

考点核心参数说明

参数或函数 作用
corrgram() 绘制相关图
student[, c(...)] 选择参与相关分析的数值变量
order = TRUE 自动调整变量顺序
lower.panel = panel.shade 下三角用颜色深浅表示相关
upper.panel = panel.pie 上三角用饼图表示相关
text.panel = panel.txt 对角线显示变量名

9. 马赛克图

考点说明

马赛克图用于查看两个分类变量之间的关系。
这里使用考试要求中的 vcd 包。

本例:查看班级和成绩等级之间的关系。

mosaic(
  ~ class + level,
  data = student,
  shade = TRUE,
  legend = TRUE,
  main = "班级与成绩等级的马赛克图"
)

考点核心参数说明

参数或函数 作用
mosaic() 绘制马赛克图
~ class + level 指定两个分类变量
data = student 指定数据框
shade = TRUE 根据偏离情况添加颜色
legend = TRUE 显示图例

10. 修改标尺

考点说明

修改标尺就是控制坐标轴范围和刻度。
常考:

  • limits:设置坐标轴范围;
  • breaks:设置刻度。
ggplot(student, aes(x = study_hours, y = average)) +
  geom_point(color = "steelblue", size = 3) +
  scale_x_continuous(
    limits = c(1, 6),
    breaks = seq(1, 6, 1)
  ) +
  scale_y_continuous(
    limits = c(60, 100),
    breaks = seq(60, 100, 10)
  ) +
  labs(
    title = "修改坐标轴标尺",
    x = "每天学习时长",
    y = "平均成绩"
  ) +
  theme_minimal()

考点核心参数说明

参数或函数 作用
scale_x_continuous() 修改 x 轴标尺
scale_y_continuous() 修改 y 轴标尺
limits = c(1, 6) 设置坐标轴范围
breaks = seq(1, 6, 1) 设置刻度间隔
seq(起点, 终点, 间隔) 生成刻度序列

11. 修改主题

考点说明

主题控制图形整体外观。
常用主题:

  • theme_minimal()
  • theme_bw()
  • theme_classic()
ggplot(student, aes(x = study_hours, y = average, color = class)) +
  geom_point(size = 3) +
  labs(
    title = "修改主题示例",
    x = "每天学习时长",
    y = "平均成绩",
    color = "班级"
  ) +
  theme_bw() +
  theme(
    plot.title = element_text(hjust = 0.5, size = 16),
    legend.position = "right"
  )

考点核心参数说明

参数或函数 作用
theme_minimal() 简洁主题
theme_bw() 黑白主题
theme_classic() 经典主题
plot.title = element_text(hjust = 0.5) 标题居中
legend.position = "right" 图例放右边

12. 条形图加标注

考点说明

条形图加标注常用 geom_text()
本例:在班级平均成绩条形图上标出具体数值。

ggplot(class_mean, aes(x = class, y = mean_average, fill = class)) +
  geom_col() +
  geom_text(
    aes(label = round(mean_average, 1)),
    vjust = -0.3
  ) +
  labs(
    title = "班级平均成绩条形图加标注",
    x = "班级",
    y = "平均成绩"
  ) +
  theme_minimal()

考点核心参数说明

参数或函数 作用
geom_text() 添加文字标注
aes(label = round(mean_average, 1)) 标注均值,保留 1 位小数
vjust = -0.3 文字放在柱子上方
round(x, 1) 保留 1 位小数

13. 参考线加标注

考点说明

参考线常用于标出平均值、标准线、及格线等。

常用函数:

  • geom_hline():水平参考线;
  • geom_vline():垂直参考线;
  • annotate():添加文字说明。

本例:在散点图中标出全体学生平均成绩。

mean_score <- mean(student$average)

ggplot(student, aes(x = study_hours, y = average)) +
  geom_point(color = "steelblue", size = 3) +
  geom_hline(
    yintercept = mean_score,
    linetype = "dashed",
    color = "red"
  ) +
  annotate(
    "text",
    x = 5,
    y = mean_score + 2,
    label = "全体平均分",
    color = "red"
  ) +
  labs(
    title = "学习时长与平均成绩:添加参考线",
    x = "每天学习时长",
    y = "平均成绩"
  ) +
  theme_minimal()

考点核心参数说明

参数或函数 作用
geom_hline() 添加水平参考线
yintercept = mean_score 参考线的 y 轴位置
geom_vline() 添加垂直参考线
xintercept = value 参考线的 x 轴位置
linetype = "dashed" 设置虚线
annotate("text", ...) 添加文字说明
x = 5, y = mean_score + 2 控制文字位置
label = "全体平均分" 标注文字内容

14. 刻面

考点说明

刻面就是把一张图按照某个分类变量拆成多张小图。
常用于分组比较。

常用函数:

  • facet_wrap(~ group)
  • facet_grid(row_group ~ col_group)

本例:按照性别分别画学习时长和平均成绩的散点图。

ggplot(student, aes(x = study_hours, y = average, color = class)) +
  geom_point(size = 3) +
  facet_wrap(~ gender) +
  labs(
    title = "按性别刻面的散点图",
    x = "每天学习时长",
    y = "平均成绩",
    color = "班级"
  ) +
  theme_minimal()

考点核心参数说明

参数或函数 作用
facet_wrap(~ gender) 按性别拆成多个小图
facet_grid(row ~ col) 按行变量和列变量拆图
color = class 小图内部仍可按班级分颜色

四、考试速查总表

1. 数据管理速查

考点 常用函数 作用
日期转换 as.Date() 字符型转日期型
日期显示 format() 改变日期显示格式
因子 factor() 设置分类变量
排序 arrange() 升序或降序排列
计算变量 mutate() 新增变量
条件变量 ifelse() / case_when() 按条件生成变量
分组汇总 group_by() + summarise() 按组计算均值、数量等

2. 绘图速查

图形 主要函数 关键点
均值条形图 geom_col() 先汇总均值
直方图 + 密度曲线 geom_histogram() + geom_density() 看连续变量分布
盒形图 + 小提琴图 geom_boxplot() + geom_violin() 比较分组分布
分组条形图 + 标注 geom_col() + geom_text() position_dodge() 并排
气泡图 geom_point() size 表示第三变量
散点图矩阵 ggpairs() 多个连续变量关系
分组散点图 geom_point() colorshape 分组
相关图 corrgram() 查看相关关系
马赛克图 mosaic() 两个分类变量关系
修改标尺 scale_x_continuous() 控制范围和刻度
修改主题 theme_*() 改外观
条形图标注 geom_text() 添加数值
参考线标注 geom_hline() + annotate() 添加平均线或标准线
刻面 facet_wrap() / facet_grid() 分组拆图

3. 考试改代码步骤

  1. 先判断题目属于哪个考点;
  2. 找对应小节;
  3. student 改成题目数据框名;
  4. xy 改成题目变量;
  5. 如果要分组均值,先写 group_by() + summarise()
  6. 如果要分类颜色,用 fill = 分组变量color = 分组变量
  7. 如果要数字标注,用 geom_text()
  8. 如果要参考线,用 geom_hline()geom_vline()
  9. 如果要分面,用 facet_wrap()