R语言数据预处理——重复基因处理。

将基因表达矩阵行名的ensembl_id ( gene_id ) 转换为gene symbol ( gene_name )的情况,而在转换时经常会出现多个ensembl_id对应与一个gene symbol的情形,此时就出现了重复的gene symbol。重复的gene symbol当然是不能作为基因表达矩阵行名的,此时就需要我们去除重复的gene symbol。

为便于验证,先随便造一个基因名有重复的表达谱数据。

set.seed(123)

expr=matrix(runif(300,5,10),ncol=10)

colnames(expr)=paste0("sample",1:10)

genes=sample(LETTERS,30,replace=T)

expr=data.frame(genes,expr)

1.直接按顺序删除第一次出现之后的所有重复基因——duplicated()函数

expr<-expr[,!duplicated(expr$genes)]

2.按重复基因表达值中位数去重——aggregate函数

expr_zhong=aggregate(.~genes,median,data=expr)

3.按重复基因表达值均值去重——aggregate函数

expr_mean=aggregate(.~genes,mean,data=expr)

4.按重复基因表达值最大值去重——aggregate函数

expr_max=aggregate(.~genes,max,data=expr)

部分来源:表达谱数据中重复基因--取平均/取最大值 - 知乎

问题:通过aggregate函数成功对基因去重,但是也改变了数据框中的数据类型,不便于后续操作,进一步改进如下

原始数据类型:numeric

aggregate函数处理后expr_zhong的:character

要将处理后的expr_zhong中的数据转换为numeric型代码如下:

# 1. 使用dplyr进行分组聚合(更灵活处理类型)

expr_zhong <- expr %>%

group_by(symbol) %>%

summarise(across(where(is.numeric), median, na.rm = TRUE), .groups = "drop") %>%

as.data.frame()

# 2. 恢复原始列类型(与expr保持一致)

for(col in colnames(expr_zhong)) {

if(col %in% colnames(expr)) {

class(expr_zhong[[col]]) <- class(expr_zhong[[col]])

}

}

# 3. 验证数据类型

class(expr$sample1)

class(expr_zhong$sample1)