Skip to content

R - 面试问题

这份 R 面试问题列表已更新,以反映现代数据科学实践。问题涵盖了核心 R 概念以及 tidyverse 生态系统,后者是许多当代 R 工作流的核心。优秀的面试官会探究您对概念的理解,而不仅仅是记忆。

Q: R 是什么,它在数据分析方面的主要优势是什么?

R 是一种专为统计计算和图形设计的编程语言和环境。它的主要优势包括:

  1. 庞大的包生态系统:CRAN(综合 R 归档网络)托管着数千个包,几乎可以满足任何统计或以数据为中心的任务。
  2. tidyverse 生态系统:一个强大、连贯的包集合(如 dplyr、ggplot2、readr),专为数据科学设计,共享共同的设计理念,使数据操作、探索和可视化变得直观高效。
  3. 统计能力:它由统计学家为统计学家构建。它为经典和前沿的统计建模提供了无与伦比的支持。
  4. 可复现性:R Markdown 和 renv 等工具使得创建可复现的分析和报告变得容易。

Q: tidyverse 是什么,它为什么如此受欢迎?

tidyverse 是一个有主见的 R 包集合,专为数据科学设计,所有包都共享一个底层设计理念、语法和数据结构。它之所以受欢迎,是因为它为最常见的数据科学任务提供了连贯且高效的工作流:导入(readr)、整理(tidyr)、操作(dplyr)、可视化(ggplot2)和函数式编程(purrr)。它使用管道(%>% 或 |>)将操作逻辑地链接在一起,使代码具有高度可读性。

Q: data.frame 和 tibble 有什么区别?

tibble 是 tidyverse 对基础 R data.frame 的现代化诠释。主要区别包括:

  • 打印:tibble 仅打印前 10 行和屏幕上能容纳的列,防止意外的控制台溢出。它们还会显示列类型。
  • 子集操作:对 tibble 使用 [ 总是返回另一个 tibble。对于 data.frame,它可能会返回一个向量,这可能导致错误。
  • 无自动转换:tibble 默认不会将字符串转换为因子,也不会更改列名,这使得脚本更具可预测性和稳定性。

Q: dplyr 的主要动词(verbs)是什么?提供一个简单的数据管道示例。

主要动词包括:

  • select():按名称选择列。
  • filter():根据逻辑条件选择行。
  • arrange():重新排列行。
  • mutate():创建新列或转换现有列。
  • summarise()(或 summarize()):将多个值汇总为一个。
  • group_by():对数据组执行操作。

示例管道:在 starwars 数据集中查找机器人(Droid)的平均质量。

library(dplyr)
starwars %>%
filter(species == "Droid") %>%
summarise(avg_mass = mean(mass, na.rm = TRUE))

Q: 解释 [ 和 [[ 在子集操作(subsetting)方面的区别。

这是一个基本概念。

  • [[ 提取单个元素。结果将具有该元素的类型。对于列表,my_list[[1]] 返回列表中内部的第一个对象。
  • [ 提取一组元素。结果将与原始对象具有相同的类型。对于列表,my_list[1] 返回一个新列表,其中仅包含原始列表的第一个元素。

类比:想象一列火车。train[[1]] 让你得到第一节车厢里的“内容”。train[1] 让你得到一列新的、只有一节车厢的“火车”。

Q: 在 R 中如何处理缺失值(NA)?

  • 识别:使用 is.na() 创建一个逻辑向量,指示 NA 出现的位置。
  • 移除:使用 na.omit() 或 tidyr::drop_na() 删除包含任何 NA 的行。
  • 计算:许多函数(如 mean()、sum() 和 sd())都有 na.rm = TRUE 参数,用于在计算时忽略 NA 值。
  • 填充(Imputation):使用 tidyr::replace_na() 将 NA 替换为特定值(例如,列的平均值或中位数)。

Q: 什么是向量循环(vector recycling)?请举例说明。

当对两个长度不同的向量执行操作时,R 会自动重复(循环)较短向量的元素,使其长度与较长向量匹配。如果较长向量的长度不是较短向量长度的倍数,则会发出警告。

示例:

c(1, 2, 3, 4, 5, 6) + c(10, 20)
# 较短的向量被循环以变为 c(10, 20, 10, 20, 10, 20)
# 结果: [1] 11 22 13 24 15 26

Q: 如何让一个 R 项目可复现?

  1. 项目组织:使用 RStudio 项目将所有文件(代码、数据、报告)自包含在一个目录中。
  2. 依赖管理:使用 renv 包。renv::init() 创建一个项目特定的库,renv::snapshot() 保存所有使用的包的精确版本,确保其他人可以使用 renv::restore() 完美地重现环境。
  3. 分析即报告:使用 R Markdown (.Rmd) 将代码、输出(图表、表格)和叙述性文本编织在一起。这创建了一个动态文档,可以重新运行以从头开始生成完整的分析。
  4. 版本控制:使用 Git 跟踪代码和分析文件的更改。

Q: read.csv() 和 readr::read_csv() 有什么区别?

readr::read_csv() 是现代的 tidyverse 替代方案,具有以下几个主要优点:

  • 速度:它显著更快,特别是对于大文件。
  • 输出:它返回一个 tibble,而不是基础 R 的 data.frame。
  • 可复现性:它默认不将字符串转换为因子,并且避免更改列名,这使得脚本更稳定。
  • 类型猜测:它拥有更强大的算法来猜测列类型,并在出现问题时提供清晰的反馈。

Q: 简要解释 ggplot2 中的图形语法(Grammar of Graphics)。

图形语法是一种理论,它将绘图描述为一组分层组件。在 ggplot2 中,这些组件包括:

  • 数据(Data):要绘制的数据集。
  • 美学映射(Aesthetics,aes):将数据变量映射到视觉属性(例如,x 位置、y 位置、color、size)。
  • 几何对象(Geometries,geom_):表示数据的几何对象(例如,用于散点图的 geom_point,用于条形图的 geom_bar)。
  • 分面(Facets):为数据的不同子集创建子图。
  • 坐标系(Coordinates):使用的坐标系统(例如,笛卡尔坐标系、极坐标系)。
  • 主题(Theme):控制非数据视觉元素(例如,字体、背景颜色)。 通过组合这些组件,您可以构建各种各样的自定义可视化。

除了技术问题,还要准备讨论您参与过的项目。解释问题、您如何使用 R 解决它,以及您面临的挑战。在解决问题的过程中表现出的信心与了解特定函数名称同样重要。祝您好运!