第1章 R语言基础回顾:从安装到数据框操作

各位好,欢迎来到这门课。

在正式开始分析物种丰度数据之前,我建议咱们先把R语言的基础再过一遍。你可能会想:「这些我都懂啊,跳过行不行?」嗯,我刚开始带项目时也这么想,结果有次分析16S数据,一个因子顺序没设对,后续差异检验全错了……从那以后,每期课程我都老老实实从基础讲起。

这一章不搞虚的,直接覆盖四个核心模块:环境安装、基本数据类型、向量与因子、数据框操作。掌握了这些,后续的丰度矩阵处理才能顺手。

R语言基础数据结构体系 R基础数据结构 向量 vector 因子 factor 数据框 data.frame 列表 list 数值型 字符型 逻辑型 有序因子 无序因子 列 = 变量 行 = 观测 💡 要点提示: 1. 向量是R中最基础的原子结构,因子专门处理分类变量。 2. 数据框是列式存储,每一列可以是不同类型(很像Excel表格)。 3. 列表可以装下任何结构,包括数据框和列表本身。

1.1 R与RStudio安装:别在这步翻车

安装本身不复杂,但有几个坑我帮你提前踩过了。

⚠️ 版本匹配问题:

R和RStudio是两个东西,先装R,再装RStudio。RStudio只是一个IDE(集成开发环境),真正干活的是R语言本体。我曾见过同事先装RStudio,发现打不开,跑来问我是不是电脑坏了……其实只是R没装。

  1. 下载R:访问 CRAN(Comprehensive R Archive Network),选你对应的操作系统。Windows用户点「base」,macOS用户选最新的.pkg文件。
  2. 安装R:一路默认路径就行。但要注意——安装路径不要有中文或空格。我之前有个项目,就因为用户名是中文,导致某些包编译报错,折腾了两小时。
  3. 下载RStudio:到 Posit(原RStudio公司)官网,选免费的「RStudio Desktop Open Source License」。
  4. 安装RStudio:同样默认路径。装完打开,在Console窗口输入以下代码测试:
print("Hello, 物种丰度分析!")
version

如果能看到版本号,恭喜你,环境搭好了。

💡 我的习惯: 安装完成后,第一时间设置CRAN镜像为国内源(比如清华或中科大镜像),不然下载包能等到你怀疑人生。在RStudio中点击 Tools → Global Options → Packages,修改默认CRAN仓库即可。

1.2 基本数据类型:R语言的「原子」

R的数据类型说多不多,说少不少。但做物种丰度分析,你每天打交道的主要就三种:

类型例检测函数说明
数值型 (numeric)3.14, -42, 2.5e3is.numeric()整数和浮点数都算数值型
字符型 (character)"OTU001", "Akkermansia"is.character()字符串,必须用引号括起来
逻辑型 (logical)TRUE, FALSE, NAis.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的细胞,因子是分类变量的灵魂。 处理分组信息时,一定要留意因子的水平顺序。
  • 数据框是你的工作台。 取列用 $,取行用 [行, 列],条件筛选是日常操作。