第1章 R语言基础回顾:从安装到数据框操作
各位好,欢迎来到这门课。
在正式开始分析物种丰度数据之前,我建议咱们先把R语言的基础再过一遍。你可能会想:「这些我都懂啊,跳过行不行?」嗯,我刚开始带项目时也这么想,结果有次分析16S数据,一个因子顺序没设对,后续差异检验全错了……从那以后,每期课程我都老老实实从基础讲起。
这一章不搞虚的,直接覆盖四个核心模块:环境安装、基本数据类型、向量与因子、数据框操作。掌握了这些,后续的丰度矩阵处理才能顺手。
1.1 R与RStudio安装:别在这步翻车
安装本身不复杂,但有几个坑我帮你提前踩过了。
R和RStudio是两个东西,先装R,再装RStudio。RStudio只是一个IDE(集成开发环境),真正干活的是R语言本体。我曾见过同事先装RStudio,发现打不开,跑来问我是不是电脑坏了……其实只是R没装。
- 下载R:访问 CRAN(Comprehensive R Archive Network),选你对应的操作系统。Windows用户点「base」,macOS用户选最新的.pkg文件。
- 安装R:一路默认路径就行。但要注意——安装路径不要有中文或空格。我之前有个项目,就因为用户名是中文,导致某些包编译报错,折腾了两小时。
- 下载RStudio:到 Posit(原RStudio公司)官网,选免费的「RStudio Desktop Open Source License」。
- 安装RStudio:同样默认路径。装完打开,在Console窗口输入以下代码测试:
print("Hello, 物种丰度分析!")
version
如果能看到版本号,恭喜你,环境搭好了。
💡 我的习惯: 安装完成后,第一时间设置CRAN镜像为国内源(比如清华或中科大镜像),不然下载包能等到你怀疑人生。在RStudio中点击 Tools → Global Options → Packages,修改默认CRAN仓库即可。
1.2 基本数据类型:R语言的「原子」
R的数据类型说多不多,说少不少。但做物种丰度分析,你每天打交道的主要就三种:
| 类型 | 例 | 检测函数 | 说明 |
|---|---|---|---|
| 数值型 (numeric) | 3.14, -42, 2.5e3 | is.numeric() | 整数和浮点数都算数值型 |
| 字符型 (character) | "OTU001", "Akkermansia" | is.character() | 字符串,必须用引号括起来 |
| 逻辑型 (logical) | TRUE, FALSE, NA | is.logical() | 条件判断的结果 |
你可能会问:「整数呢?浮点呢?」在R里,整数也是numeric的一类,用is.integer()可以单独检测。但说实话,日常分析中我很少刻意区分——R在底层自动帮你处理了。
# 看看这些是什么类型
x <- 42
y <- "Proteobacteria"
z <- x > 30
class(x) # "numeric"
class(y) # "character"
class(z) # "logical"
🔑 一个关键认知: R中的 NA(缺失值)属于逻辑型,但可以出现在任何类型的向量里。处理物种丰度矩阵时,NA 和 0 完全是两回事——别搞混了。我见过有人把缺失值当0去算丰度,结果下游alpha多样性全偏了。
1.3 向量与因子:最常用的两种结构
向量是R的基石。说白了,就是同一类型数据的「一列」。创建向量的函数是 c()(combine的缩写)。
# 数值向量
abundance <- c(120, 45, 89, 203, 67)
# 字符向量
taxa_names <- c("OTU001", "OTU002", "OTU003")
# 逻辑向量
is_high_abundance <- abundance > 100
# 向量取子集
abundance[1] # 第一个元素
abundance[abundance > 80] # 筛选大于80的值
因子呢?它专门用来表示分类变量。比如:分组信息(处理组 vs 对照组)、门水平分类(Firmicutes、Bacteroidetes……)。因子有两个核心属性:值和水平。
# 创建因子
group <- factor(c("Control", "Treatment", "Control", "Treatment"))
levels(group) # 看看有哪些水平
# 有序因子 —— 比如丰度等级
ab_level <- factor(c("Low", "High", "Medium"),
levels = c("Low", "Medium", "High"),
ordered = TRUE)
⚠️ 避坑指南: 我曾经在分析中直接用 as.numeric() 转换因子,结果发现数字完全对不上。这是因为 as.numeric(factor) 返回的是因子「水平」的编号,而不是原始值。正确的做法是:as.numeric(as.character(factor))。记住了,血的教训。
1.4 数据框操作:你的核心战场
物种丰度分析中,数据框(data.frame)是你每天都要面对的结构。它类似于Excel表格:列是变量,行是观测。
创建数据框
# 模拟一个简单的丰度数据框
df <- data.frame(
OTU_ID = c("OTU001", "OTU002", "OTU003"),
Sample_A = c(120, 45, 89),
Sample_B = c(98, 32, 112),
Group = c("Control", "Treatment", "Control"),
stringsAsFactors = FALSE # 重要!不让字符自动转因子
)
df
注意上面这个 stringsAsFactors = FALSE。R 4.0之前默认会把字符列转成因子,坑过不少人。我个人习惯是永远加上这个参数,等需要因子时手动转。
常用操作一览
| 操作 | 代码 | 说明 |
|---|---|---|
| 查看结构 | str(df) | 显示每列类型和前几个值 |
| 查看前几行 | head(df), head(df, 10) | 默认6行 |
| 取列(返回向量) | df$Sample_A | 用 $ 最直接 |
| 取列(返回数据框) | df[, "Sample_A", drop = FALSE] | 保留数据框结构 |
| 取行子集 | df[1:2, ] | 前两行 |
| 条件筛选 | df[df$Group == "Control", ] | 筛选对照组 |
| 新增列 | df$Mean_Ab <- (df$Sample_A + df$Sample_B) / 2 | 直接赋值即可 |
| 删除列 | df$Mean_Ab <- NULL | 设为NULL就移除了 |
一个实战小例子
# 计算每个OTU在两个样本中的平均丰度
df$Mean_Abundance <- rowMeans(df[, c("Sample_A", "Sample_B")])
# 筛选平均丰度 > 80 的OTU
high_otu <- df[df$Mean_Abundance > 80, ]
high_otu
# 按丰度降序排序
df_sorted <- df[order(df$Mean_Abundance, decreasing = TRUE), ]
df_sorted
💡 效率小技巧: 用 subset() 函数可以让筛选代码更简洁:subset(df, Mean_Abundance > 80)。不过 subset() 在复杂逻辑时可能有副作用,我一般只在交互式探索时用它,正式脚本中还是用 df[条件, ] 更稳妥。
1.5 本章小结——你带走的
这一章咱们走了一遍R语言最基础但最重要的几个概念。不说虚的,你只需要记住:
- 安装时先R后RStudio,路径别带中文。
- 三种基本类型:numeric、character、logical —— 丰度数据绝大多数是numeric。
- 向量是R的细胞,因子是分类变量的灵魂。 处理分组信息时,一定要留意因子的水平顺序。
- 数据框是你的工作台。 取列用
$,取行用[行, 列],条件筛选是日常操作。