第 1 章 数据预处理
1.1 加载数据
这一步是加载我们的原始数据,分为两个部分,一个是实验设计文件,一个是原始的表达矩阵。 可以根据需求替换成自己的数据。但是需要注意的是,实验设计文件中的分组信息需要和表达矩阵中的样本名一一对应。 设计文件中,有sample 和 group 两列,分别代表样本名和分组信息。 表达矩阵中,第一列是基因名,后面的列是样本名,且样本名顺序和设计文件中的样本名顺序一致。
# 加载包
library(data.table)
library(tidyverse)
# 加载分组设计文件
design <- fread("design.csv") %>%
mutate(group = factor(group, levels = c("s_MiaFRFP", "s_Part1Lag")))
group_list <- design$group
head(design)
## run group sample
## <char> <fctr> <char>
## 1: SRR19913146 s_MiaFRFP s_MiaFRFP_1
## 2: SRR19913145 s_MiaFRFP s_MiaFRFP_2
## 3: SRR19913144 s_MiaFRFP s_MiaFRFP_3
## 4: SRR19913143 s_Part1Lag s_Part1Lag_1
## 5: SRR19913142 s_Part1Lag s_Part1Lag_2
## 6: SRR19913141 s_Part1Lag s_Part1Lag_3
head(group_list)
## [1] s_MiaFRFP s_MiaFRFP s_MiaFRFP s_Part1Lag s_Part1Lag s_Part1Lag
## Levels: s_MiaFRFP s_Part1Lag
# 加载表达矩阵,去除重复基因,并将样本名顺序和设计文件中的样本名顺序一致
counts <- fread("counts.csv") %>%
distinct(name, .keep_all = T) %>%
dplyr::select(name, design$sample, everything())
head(counts)[1:4, 1:4]
## name s_MiaFRFP_1 s_MiaFRFP_2 s_MiaFRFP_3
## <char> <int> <int> <int>
## 1: ENSG00000228037 2 0 0
## 2: ENSG00000142611 2088 1753 2396
## 3: ENSG00000284616 0 0 0
## 4: ENSG00000157911 5039 3794 48701.2 过滤低表达数据
为了避免低表达基因对后续分析的影响,我们需要过滤掉低表达基因。
# 将基因 ID 作为行名
mat <- dplyr::select(counts, design$sample)
rownames(mat) <- counts$name
# 筛选出至少在两个样本中表达的基因
keep_feature <- rowSums (mat > 1) >= 2 ;table(keep_feature)
## keep_feature
## FALSE TRUE
## 32850 30290
ensembl_matrix <- mat[keep_feature, ]
rownames(ensembl_matrix) <- rownames(mat)[keep_feature]
ensembl_matrix <- rownames_to_column(ensembl_matrix, var = "name")1.3 转换基因 ID
一般情况下,我们会使用 SYMBOL ID 进行分析,因为SYMBOL ID 的命名与基因的功能更加接近, 所以需要将 ENSEMBL ID 转换为 SYMBOL ID,也方便后续我们的分析。
# 加载包
library(biomaRt)
# 连接ensembl数据库
ensembl <- useMart("ensembl", dataset = "hsapiens_gene_ensembl")
# atr <- listAttributes(ensembl) # 查看数据库中有哪些信息
# 获得数据库中关注的 ID 信息
ids <- getBM(attributes = c("ensembl_gene_id", "hgnc_symbol","entrezgene_id"),
mart = ensembl)
# 修改列名
colnames(ids) <- c("ENSEMBL", "SYMBOL", "ENTREZ")
# 去除重复 ID
ids=ids[!duplicated(ids$ENSEMBL),]
# 连接基因 counts 矩阵和 ID 信息
All_gene_counts <- merge(ensembl_matrix, ids, by.x = "name", by.y = "ENSEMBL", all.x = TRUE) %>%
dplyr::select(name, SYMBOL, ENTREZ, everything())
# 输出注释结果
dir.create("Expression_result", showWarnings = F)
write.csv(All_gene_counts, "Expression_result/All_gene_counts.csv", row.names = F)