第1章 R语言入门:R与RStudio安装、基本数据类型与向量操作
好,咱们直接进入正题。这第一章,说白了就是打地基。我见过太多同学上来就撸机器学习,结果连数据框都建不利索,调了半天参发现是数据类型搞错了。嗯,这种坑我自己也踩过,所以咱们一步一步来,先把工具配好,把最基础的几个概念摸透。
1.1 环境搭建:R与RStudio
在开始敲代码之前,先把战场布置好。R是计算引擎,RStudio是IDE界面。我个人习惯先装R,再装RStudio,顺序反了可能会报奇奇怪怪的路径错误。
安装步骤
- 去CRAN(
https://cran.r-project.org/)下载对应系统的R基础包。 - 一路默认安装,但注意:Windows用户建议勾选“将R添加到系统PATH”。
- 去RStudio官网(
https://posit.co/download/rstudio-desktop/)下载免费版安装。 - 打开RStudio,确认界面右下角Console里出现R版本信息。
快速验证:在Console里输入以下代码,能打印出“Hello R”就算装对了。
print("Hello R")
version$version.string
避坑指南:我曾经在公司的内网机器上装R,忘了设置libPaths,结果所有包都装到了默认的C盘,后来空间爆了才发现。建议安装后立即运行.libPaths()确认包路径。
1.2 基本数据类型:你得认识这五种
R里的数据就像工具箱里的螺丝刀,不同类型干不同活儿。别急,我挨个讲,顺便给个日常项目中的真实用法。
| 类型 | 说明 | 举例 |
|---|---|---|
| 数值型 (numeric) | 整数和小数统称 | 3.14, -5, 1e3 |
| 字符型 (character) | 字符串,用引号括起来 | "丰度", 'OTU_001' |
| 逻辑型 (logical) | TRUE/FALSE | TRUE, FALSE, 3 > 5 |
| 整数型 (integer) | 纯整数,要加L后缀 | 42L, -7L |
| 复数型 (complex) | 不常用,但了解下 | 1 + 2i |
你想想看,为啥要区分integer和numeric?我在处理丰度矩阵时发现,默认读进来的整数会被当作numeric,存储翻一倍。后来我养成习惯:明确用as.integer()转换,尤其处理样本分组编号时。
调试小技巧:用class()和typeof()查看类型,比猜靠谱得多。比如:
a <- 3
class(a) # "numeric"
b <- 3L
class(b) # "integer"
类型转换与强转
R比较“佛系”——它会在需要时自动转换。但自动转换经常偷摸改你的数据,比如逻辑值变成0/1。我建议关键操作前手动转:
x <- c(TRUE, FALSE, TRUE)
as.numeric(x) # 1 0 1
as.character(x) # "TRUE" "FALSE" "TRUE"
坑别踩:把字符型转数值时会出NA,R不会警告你。我曾经在分析OTU丰度时忘了这茬,结果一半NA没发现,等到画图时才发现曲线断得一塌糊涂。切记:转完类型第一步,检查sum(is.na(你的数据))。
1.3 向量:R语言的核心武器
向量是R最基础的数据结构。说白了,一堆同类型元素排成一行。几乎所有丰度数据——不管是物种计数还是功能基因拷贝数——都是以向量的形式参与计算。
创建向量
最常用的是c()函数(combine的缩写)。记住:向量里所有元素类型必须一致(自动强制转换)。
# 数值向量
abundance <- c(120, 340, 55, 890, 231)
# 字符向量
samples <- c("S1", "S2", "S3", "S4")
# 利用冒号快速生成整数序列
index <- 1:10 # 1 2 3 ... 10
# rep() 和 seq() 也经常用
rep(0, 5) # 0 0 0 0 0
seq(from=0, to=1, by=0.25) # 0.00 0.25 0.50 0.75 1.00
向量索引与切片
R的索引从1开始,跟大多数编程语言不一样。我刚开始就常写错,后来习惯了反而觉得自然。
vec <- c(10, 20, 30, 40, 50)
vec[3] # 30
vec[c(1, 4)] # 10 40
vec[-2] # 去掉第二个元素:10 30 40 50
vec[vec > 30] # 返回大于30的元素:40 50
实战片段:在丰度分析中经常要筛选高丰度物种。假设你有otu_counts向量,要保留大于中位数的:
high_abundance <- otu_counts[otu_counts > median(otu_counts)]
length(high_abundance)
向量化运算——R的隐藏加速器
我记得第一次接触R向量化运算时非常震撼:原来不用写for循环!你想想看,对每个元素乘系数,直接写一个表达式就能搞定。这背后是C语言级别的循环,比手写for快几个量级。
a <- 1:5
b <- 6:10
a + b # 7 9 11 13 15
a * 2 # 2 4 6 8 10
a^2 # 1 4 9 16 25
循环补齐也是个有意思的特性:两个向量长度不一样时,短的会“循环”补全。例如:
c(1, 2, 3) + c(10, 20) # 11 22 13,R会循环使用第二个向量的10和20
我的习惯:写任何向量运算前,先用length()检查双方长度,避免循环补齐给了你意料之外的结果。我在做相对丰度归一化时被这个坑过——除数向量少了一个元素,结果所有值都偏了。
常用向量函数速览
| 函数 | 作用 | 示例 |
|---|---|---|
sum() | 求和 | sum(c(1,3,5)) → 9 |
mean() | 均值 | mean(1:10) → 5.5 |
sd() | 标准差 | sd(rnorm(100)) |
table() | 频数统计 | table(c("A","B","A")) → A:2, B:1 |
which() | 返回满足条件的下标 | which(c(3,7,2) > 4) → 2 |
这些函数配合向量索引,能瞬间完成很多任务。比如找丰度最高的前5个OTU:
top5 <- order(abundance, decreasing = TRUE)[1:5]
abundance[top5]
小结与衔接
好,第一章就到这。我们搞定了RStudio安装、认识了五种基本数据类型、学会了向量的创建与运算。这些听起来基础,但你在后续所有数据清洗、重抽样、参数调优里都会反复用到——说白了,它们是R世界里最底层的砖头。