R - 面试问题
现代 R 面试问题
Section titled “现代 R 面试问题”这份 R 面试问题列表已更新,以反映现代数据科学实践。问题涵盖了核心 R 概念以及 tidyverse 生态系统,后者是许多当代 R 工作流的核心。优秀的面试官会探究您对概念的理解,而不仅仅是记忆。
Q: R 是什么,它在数据分析方面的主要优势是什么?
R 是一种专为统计计算和图形设计的编程语言和环境。它的主要优势包括:
- 庞大的包生态系统:CRAN(综合 R 归档网络)托管着数千个包,几乎可以满足任何统计或以数据为中心的任务。
tidyverse生态系统:一个强大、连贯的包集合(如dplyr、ggplot2、readr),专为数据科学设计,共享共同的设计理念,使数据操作、探索和可视化变得直观高效。- 统计能力:它由统计学家为统计学家构建。它为经典和前沿的统计建模提供了无与伦比的支持。
- 可复现性: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 26Q: 如何让一个 R 项目可复现?
- 项目组织:使用 RStudio 项目将所有文件(代码、数据、报告)自包含在一个目录中。
- 依赖管理:使用
renv包。renv::init()创建一个项目特定的库,renv::snapshot()保存所有使用的包的精确版本,确保其他人可以使用renv::restore()完美地重现环境。 - 分析即报告:使用 R Markdown (
.Rmd) 将代码、输出(图表、表格)和叙述性文本编织在一起。这创建了一个动态文档,可以重新运行以从头开始生成完整的分析。 - 版本控制:使用 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 解决它,以及您面临的挑战。在解决问题的过程中表现出的信心与了解特定函数名称同样重要。祝您好运!