[生信入门笔记]2.生信相关R语言基础

参考视频:


说在前头:注意,学习编程语言的基本逻辑就是动手自己试一试。所以我建议大家亲自动手敲(不是复制)并执行每一行代码,这样学习才会事半功倍。


安装 R 包

你可知安装R包有那三样写法?

从 CRAN 安装

CRAN 是 R 语言的官方综合档案网络,也是最主要、最基础的 R 包发布平台。
其特点是 CRAN 对提交的包有严格的质量、文档和兼容性审查,因此这里的包通常稳定且维护良好,适用于大多数通用场景。
安装方法

1
2
# 从CRAN安装
install.packages("包名")

从 Bioconductor 安装

Bioconductor 是一个专注于生物信息学的开源软件项目,为基因组数据分析(如 RNA-seq、单细胞测序等)提供大量高质量的R包。
其特点是这里的包高度集中于生物信息学领域,能处理高通量生物学数据,且包之间集成度高,通常每年更新两次
安装方法

1
2
3
4
5
6
# 从Bioconductor安装
# 判断R环境是否已经安装BiocManager,若没有则安装
if(!requireNamespace("BiocManager",quietly = TRUE)) install.packages("BiocManager")
# 使用BiocManager的install函数安装包
BiocManager::install("GEOquery")
# 此处::install是使用BiocManager命名空间中的函数install函数的意思

从 Github 安装

GitHub 是一个面向开源及私有软件项目的代码托管平台,并非R专用。
其特点是许多 R 包在正式发布到 CRAN 或 Bioconductor 之前,会先在 GitHub 上进行开发和分享。因此,这里的包通常包含最新、最前沿的功能,但可能不够稳定。
安装方法

1
2
3
4
5
6
7
# 从Github安装
# 判断R环境是否已经安装devtools,若没有则安装
if(!requireNamespace("devtools",quietly = TRUE)) install.packages("devtools")
library(devtools)
# 使用devtools的install_github函数安装包
devtools::install_github("包名")
# 此处::install_github是使用devtools命名空间中的函数install_github函数的意思

R script 脚本一般的初始化流程

初始化应:

  1. 修改报错为英文报错
  2. 禁止转化为因子
  3. 清空环境
1
2
3
4
5
6
7
8
9
10
# 修改报错为英文
Sys.setenv(LANGUAGE = "en")
# 禁止转化为因子
# 在读取数据(如read.csv)或创建数据框(data.frame)时
# 让所有字符型列(string)保持为普通的字符向量,而不再默认自动转换为因子(Factor)
# 注:R 4.0.0版本以后,该参数的默认值已经改为FALSE
# 但显式写出这行代码可以保证你的脚本在旧版本R中也能按预期运行
options(stringsAsFactors = FALSE)
# 清空环境
rm(list = ls())

数据结构与数据类型

数据结构

R 语言有5种基本的数据结构
数据结构

  1. 向量 Vector
    有序、一维的数据
  2. 矩阵 Matrix
    要求各列数据类型相同
  3. 数组 Array
  4. 数据框 Data frame
    各列的数据类型可以不同

数据类型

  1. 字符型 Character
  2. 数值型 Numeric
    包括小数
  3. 整型 Integer
  4. 复数型 Complex
  5. 逻辑型 Logical
    即布尔型:TRUE/FALSE

向量 Vector

向量由元素组成,所有元素必须属于同一类型(数值型、字符型、逻辑型)。

1
2
3
4
5
6
# 使用c函数创建向量
a <- c(1.2, 3.4, 5.6)
b <- c("TP53", "BRCA1", "EGFR")
d <- c(T, F, T)
# 1:5 即创建从1~5的向量,即c(1, 2, 3, 4, 5) 或 c(1:5)
e <- 1:5

我们可以使用 class 函数判断数据类型

1
2
3
4
5
# 判断数据类型
class(a)
class(b)
class(d)
class(e)

执行得出结果:
判断数据类型
向量的元素可以被索引。在R语言中,向量的索引(Indexing) 就是通过位置、条件或名称,从向量中提取出你需要的特定元素。

  1. 正整数索引(按位置取)
    最基础的用法,传入一个或多个正整数,提取对应位置的元素。
1
2
3
4
5
6
7
8
9
# 向量的索引
# 正整数索引
expr <- c(2.5, 1.8, 5.2, 3.9, 4.1)
# 提取第3个元素
expr[3]
# 提取第1、第3、第5个元素(切片)
expr[c(1, 3, 5)]
# 提取连续位置(1到4)
expr[1:4]

执行得出结果:
正整数索引
同样的,我们也可以对索引的对应元素进行赋值

1
2
3
4
5
6
# 赋值
# 赋值前
expr[3]
# 赋值后
expr[3] = 1.1
expr[3]

继续上面的代码执行得:
赋值

  1. 负整数索引(剔除/反选)
    在索引前加 - 号,表示剔除该位置的元素,返回剩余所有元素。注意:正整数和负整数不能混用
1
2
3
4
5
# 剔除
# 剔除第2个元素
expr[-2]
# 剔除第1和第4个元素
expr[-c(1, 4)]

继续上面的代码执行得:
负整数索引
3. 逻辑索引(条件筛选)
是生信中最常用的索引方式。传入一个与向量长度相等的逻辑值向量(TRUE/FALSE),R只返回对应位置为 TRUE 的元素。这是配合比较运算符进行筛选的核心手段。

1
2
3
4
5
6
7
8
logFC <- c(1.2, -0.5, 2.3, -1.1, 0.8)
# 筛选出差异表达基因:找出 logFC > 1 的基因
logFC[logFC > 1] # 结果:1.2 2.3
# 筛选表达量在 2.0 到 4.0 之间的基因(且关系)
expr[expr > 2.0 & expr < 4.0] # 结果:2.5 3.9
# 筛选出包含特定基因(或关系)
gene_list <- c("GeneA", "GeneC", "GeneF")
expr[names(expr) %in% gene_list] # 结果:2.5 5.2(GeneF不存在,仅返回存在的)
  1. 字符索引(按名称取)
    如果向量有名称属性(names),你可以直接使用字符串来提取,而不用记住位置。这在提取特定基因时非常直观。

数据框 Data frame

矩阵 Matrix 其实是数据框的一种特殊形式(数据类型一致)。

R 中数据的储存与读取

数据的读取

  1. 文本数据的读取
    文档可以用文本编辑器或者 Excel(推荐)打开。
    若要将此文档读取入 R studio 项目中,可以使用 read.tableread.csv 函数进行。此处请手动下载GPL570的平台信息到项目目录。
1
2
3
4
5
# 读取txt文件
# read.table读取txt文件
anno1 <- read.table("GPL570-55999.txt", sep = "\t", header = T, fill = T)
# 排除1~17行元数据
anno2 <- read.table("GPL570-55999.txt", sep = "\t", header = T, fill = T, skip = 17)

可以观察到,该数据表已经被成功读取。
read.table读取

如果使用read.csv读取数据。数据前面的元数据必须跳过,不然会出现错误!

1
2
# read.csv读取txt文件
anno3 <- read.csv("GPL570-55999.txt", sep = "\t", header = T, fill = T, skip = 16)

如果需要将第一列作为row name, 则需要添加如下参数。

1
2
# 将第一列作为row name
anno4 <- read.table("GPL570-55999.txt", sep = "\t", header = T, fill = T, skip = 16, row.names = 1, quote = "")

⚠️如果出现下图的报错信息,请查看 quote = “” 参数是不是成功指定。
row name设置报错
为什么会有这个错误?
警告(EOF within quoted string):你的文件(GPL平台注释文件)中,某些列(通常是基因描述或探针序列)里包含了双引号 “,且不成对。R 在读取时误以为字符串还没有结束,于是会把后面几行的内容吞并到当前行,导致整个表格结构错乱。

错误(重复行名):结构错乱后,R 把本该是多行的数据合并成了一行,导致读取到的有效行数变少,而第一列(探针ID)原本是唯一的,但因为合并,现在出现了很多 NA 或重复片段,R 检测到重复值,直接报错终止。
quote = “” 在读取时忽略文件中的引号,把引号当作普通字符处理。

  1. fread函数
    fread() 是 R 语言 data.table 包中的一个函数,用于快速、便捷地读取表格数据。你可以把它看作 read.table() 的“超级加速”版,可以运用多线程读取数据。
    它的一大特点是高度自动化,大多数情况下,你只需提供文件名,它就能自动处理分隔符、表头、列类型等繁琐细节
    使用 fread 函数需要使用 data.table 包。
1
2
# 加载 data.table 包
library(data.table)

理论上来说,fread 可以自动识别你的分隔类型(无论是 Tab 还是符号),sep 参数可以缺省。data.table 的缺省值为 TRUE,返回的是一个 data.table 结构,而我们需要的是数据框,所以必须改为 FALSE。

1
2
3
4
# fread读取数据
anno5 <- fread("GPL570-55999.txt", sep = "\t", header = T, data.table = F)
# 缺省sep参数读取数据
anno6 <- fread("GPL570-55999.txt", header = T, data.table = F)

实操下来,fread读取数据相比前面两种方法快了很多,这是fread函数的多线程特性造成的。

突然发现,anno1 和 anno2 对比后面的 anno3~5 少了整整 2.6w 行,说明我们实际使用下来,应该使用后面的几种方法。(具体原因大家自行研究吧!)

  1. 数据的提取
    此时,我们得到的 anno 为数据框(可以使用 class 函数确认。我们一般使用 colnames 与 rownames 获取数据框的行名与列名,此时,得到的是字符型的向量。
1
2
3
4
5
6
7
8
# 获取行名与列名
# 获取行名
rn = rownames(anno6)
# 获取列名
cn = colnames(anno6)
# 查看 rn、cn的数据类型
class(rn)
class(cn)

我们可以对anno的行名或列名进行手动的修改。

1
2
3
# 修改行名与列名
colnames(anno5)[2] <- "ABC"
rownames(anno5)[2] <- "BCA"

此时,完成了修改。
修改行列名

如何读取某一部分特定的数据?
根据先前的经验,我们可以使用中括号 [] 进行读取。

1
2
3
4
5
6
7
8
9
10
11
12
# 读取第1个元素
n1 <- anno6[1, 1]
# 读取第1行第5个元素
n2 <- anno6[1, 5]
# 读取第1行元素
n3 <- anno6[1,]
# 读取第1列元素
n4 <- anno6[, 1]
# 读取第7、8列
n5 <- anno6[, c(7,8)]
# 读取7~9列
n6 <- anno6[, 7:9]

值得注意,如果查看n3、n4的类型,我们可以发现,n4是向量,而n3是数据框
所以,数据框的基本单位是由等长的向量(列)构成的。而提取的行是一个数据框。
提取数据的类型

如果使用anno[1]提取,则提取到的列是一个数据框。

当然还有另外一种读取方式:使用 $ 符号提取某一列。如果名称中含有空格,需要加上引号。

1
2
3
4
5
6
7
8
# $提取Gene Symbol列
m1 <- anno6$`Gene Symbol`
# 等价于
m1 <- anno6[, "Gene Symbol"]
# $提取ID列
m2 <- anno6$ID
# 等价于
m2 <- anno6[, "ID"]

如果想增加某一列(含列名),也可以使用 $ 符号。

1
2
# 增加新ZZZ列,内容全为FFF
anno5$ZZZ <- "FFF"

新增列

综上,R 语言含有两种提取规则:按序号提取按名称提取

  1. 创建数据框
    可以使用 data.frame 创建数据框。
    由于数据库的特性,数据库的创建按列构成。
1
2
3
4
5
# 创建数据框
f1 <- data.frame(
y1 = c("a", "b", "c", "d"),
y2 = c(5, 6, 7, 8)
)

列表

R语言中的列表与R语言中的向量、数组和矩阵不同,它的每个分量的数据类型可以是不同的。列表是对象的集合,可以包含向量、矩阵、数组,数据框,甚至是另外一个列表,且在列表中要求每一个成分都要有一个名称。列表中的对象又称为它的分量(components)。

  1. list 的创建
    列表使用 list 函数创建。
1
2
3
4
5
6
# 列表
# 创建列表
list1 <- list(cn = c("Data_7", "Yoojun", "Hehonge", "OYGL"),
major = c("Medicine", "Program", "Art", "Engineer"),
score = matrix(c(11, 12, 13, 14, 15, 16, 17, 18, 19, 20,21, 22), nrow = 4))
print(list1)
  1. list 数据的提取
    使用双中括号 [[]] 提取某一组元素。
1
2
# 提取第一组数据
list1[[1]]

提取第一组数据
此时提取出的是一个字符向量,可以使用list1[[1]][1]提取"Data_7"。也可以使用list1[["score"]]提取score所包含的元素。

如果我们对第一节课

1
gset <- getGEO("GSE12417", destdir = ".", getGPL = FALSE)

所得到的 gset 变量使用 class 函数查看类型,可以发现我们通过 getGEO 获取的数据是以list形式储存的。我们同样可以使用上述方式进行数据的读取。

1
2
3
4
5
# 提取GEO数据
# 提取第二个表达集合
e2 = gset[[2]]
# 等价于
e2 = gset[["GSE12417-GPL96_series_matrix.txt.gz"]]

下节预告

  • 生存曲线

  • 7月26日:今日学习生信第二课。
  • 7月27日:玩游戏。
  • 7月28日:无事,玩游戏。
  • 7月29日:Data_7啊Data_7!你怎么能如此堕落!先前定下的学习计划你都忘了吗?子曰:“吾日三省吾身。”不能再这样下去了!
  • 7月30日:玩游戏?

[生信入门笔记]2.生信相关R语言基础
http://blog.dataseven.fun/2026/07/26/生信入门笔记-2-生信相关R语言基础/
作者
Data708983
发布于
2026年7月26日
许可协议