解决函数冲突问题
您遇到的错误是由于函数名冲突造成的。在 R 中,当多个包有相同名称的函数时,可能会发生这种情况。让我们修复这个问题:
安装必要的包
if (!require(“tidyverse”, quietly = TRUE))
install.packages(“tidyverse”)
library(tidyverse)
定义处理多基因注释的函数(使用显式命名空间)
probe_to_gene_multiple <- function(expr_matrix, annot_table) {
提取探针ID和基因符号
probe2gene <- annot_table[, c(“ID”, “Gene Symbol”)]
colnames(probe2gene) <- c(“ProbeID”, “GeneSymbol”)
清洗基因符号(去除空值和无效值)
probe2gene <- probe2gene[!is.na(probe2geneKaTeX parse error: Expected 'EOF', got '&' at position 13: GeneSymbol) &̲
…GeneSymbol != “” &
probe2gene$GeneSymbol != “—”, ]
只保留表达矩阵中存在的探针
common_probes <- intersect(probe2geneProbeID,rownames(exprmatrix))probe2gene<−probe2gene[probe2geneProbeID, rownames(expr_matrix)) probe2gene <- probe2gene[probe2geneProbeID,rownames(exprmatrix))probe2gene<−probe2gene[probe2geneProbeID %in% common_probes, ]
拆分多基因注释
probe2gene_split <- probe2gene %>%
dplyr::mutate(GeneSymbol = stringr::str_split(as.character(GeneSymbol), " /// ")) %>%
tidyr::unnest(GeneSymbol)
将表达矩阵转换为数据框
expr_df <- as.data.frame(expr_matrix) %>%
tibble::rownames_to_column(“ProbeID”)
合并表达矩阵和基因符号
merged_df <- expr_df %>%
dplyr::inner_join(probe2gene_split, by = “ProbeID”)
聚合表达值
agg_expr <- merged_df %>%
dplyr::select(-ProbeID) %>%
dplyr::group_by(GeneSymbol) %>%
dplyr::summarise(dplyr::across(dplyr::everything(), mean)) %>%
as.data.frame()
设置行名为基因符号
rownames(agg_expr) <- agg_exprGeneSymbolaggexprGeneSymbol agg_exprGeneSymbolaggexprGeneSymbol <- NULL
return(as.matrix(agg_expr))
}
尝试转换
expr_32967_gene <- probe_to_gene_multiple(expr_32967, annot_table)
expr_104786_gene <- probe_to_gene_multiple(expr_104786, annot_table)
替代方案:避免使用 tidyverse
如果问题仍然存在,我们可以使用基础 R 函数实现相同的功能:
使用基础 R 函数实现
probe_to_gene_multiple_base <- function(expr_matrix, annot_table) {
提取探针ID和基因符号
probe2gene <- annot_table[, c(“ID”, “Gene Symbol”)]
colnames(probe2gene) <- c(“ProbeID”, “GeneSymbol”)
清洗基因符号(去除空值和无效值)
probe2gene <- probe2gene[!is.na(probe2geneKaTeX parse error: Expected 'EOF', got '&' at position 13: GeneSymbol) &̲
…GeneSymbol != “” &
probe2gene$GeneSymbol != “—”, ]
只保留表达矩阵中存在的探针
common_probes <- intersect(probe2geneProbeID,rownames(exprmatrix))probe2gene<−probe2gene[probe2geneProbeID, rownames(expr_matrix)) probe2gene <- probe2gene[probe2geneProbeID,rownames(exprmatrix))probe2gene<−probe2gene[probe2geneProbeID %in% common_probes, ]
拆分多基因注释
split_genes <- strsplit(as.character(probe2gene$GeneSymbol), " /// ")
创建新的映射表
probe2gene_split <- data.frame(
ProbeID = rep(probe2gene$ProbeID, sapply(split_genes, length)),
GeneSymbol = unlist(split_genes),
stringsAsFactors = FALSE
)
将表达矩阵转换为数据框
expr_df <- as.data.frame(expr_matrix)
expr_df$ProbeID <- rownames(expr_df)
合并表达矩阵和基因符号
merged_df <- merge(expr_df, probe2gene_split, by = “ProbeID”)
聚合表达值
agg_expr <- aggregate(
merged_df[, setdiff(colnames(merged_df), c(“ProbeID”, “GeneSymbol”))],
by = list(GeneSymbol = merged_df$GeneSymbol),
FUN = mean
)
设置行名为基因符号
rownames(agg_expr) <- agg_exprGeneSymbolaggexprGeneSymbol agg_exprGeneSymbolaggexprGeneSymbol <- NULL
return(as.matrix(agg_expr))
}
尝试转换
expr_32967_gene <- probe_to_gene_multiple_base(expr_32967, annot_table)
expr_104786_gene <- probe_to_gene_multiple_base(expr_104786, annot_table)
如果仍然遇到问题:简化方法
如果上述方法仍然有问题,我们可以使用更简单的方法:
简化方法:只保留第一个基因符号
probe_to_gene_simple <- function(expr_matrix, annot_table) {
提取探针ID和基因符号
probe2gene <- annot_table[, c(“ID”, “Gene Symbol”)]
colnames(probe2gene) <- c(“ProbeID”, “GeneSymbol”)
清洗基因符号(去除空值和无效值)
probe2gene <- probe2gene[!is.na(probe2geneKaTeX parse error: Expected 'EOF', got '&' at position 13: GeneSymbol) &̲
…GeneSymbol != “” &
probe2gene$GeneSymbol != “—”, ]
只保留表达矩阵中存在的探针
common_probes <- intersect(probe2geneProbeID,rownames(exprmatrix))probe2gene<−probe2gene[probe2geneProbeID, rownames(expr_matrix)) probe2gene <- probe2gene[probe2geneProbeID,rownames(exprmatrix))probe2gene<−probe2gene[probe2geneProbeID %in% common_probes, ]
只保留第一个基因符号
probe2geneGeneSymbol<−sapply(strsplit(as.character(probe2geneGeneSymbol <- sapply(strsplit(as.character(probe2geneGeneSymbol<−sapply(strsplit(as.character(probe2geneGeneSymbol), " /// "),
function(x) x[1])
处理多个探针对应同一基因的情况
expr_subset <- expr_matrix[probe2geneProbeID,,drop=FALSE]aggexpr<−aggregate(exprsubset,by=list(Gene=probe2geneProbeID, , drop = FALSE]
agg_expr <- aggregate(
expr_subset,
by = list(Gene = probe2geneProbeID,,drop=FALSE]aggexpr<−aggregate(exprsubset,by=list(Gene=probe2geneGeneSymbol),
FUN = mean
)
设置行名为基因符号
rownames(agg_expr) <- agg_exprGeneaggexprGene agg_exprGeneaggexprGene <- NULL
return(agg_expr)
}
尝试转换
expr_32967_gene <- probe_to_gene_simple(expr_32967, annot_table)
expr_104786_gene <- probe_to_gene_simple(expr_104786, annot_table)
调试建议
如果问题仍然存在,请尝试以下调试步骤:
1. 检查数据
cat(“expr_32967 维度:”, dim(expr_32967), “\n”)
cat(“expr_104786 维度:”, dim(expr_104786), “\n”)
cat(“annot_table 维度:”, dim(annot_table), “\n”)
2. 检查特定探针
check_probe <- function(probe_id) {
cat(“探针”, probe_id, “在 expr_32967 中存在:”, probe_id %in% rownames(expr_32967), “\n”)
cat(“探针”, probe_id, “在 expr_104786 中存在:”, probe_id %in% rownames(expr_104786), “\n”)
cat(“探针”, probe_id, “在 annot_table 中存在:”, probe_id %in% annot_table$ID, “\n”)
if (probe_id %in% annot_tableKaTeX parse error: Expected '}', got 'EOF' at end of input: … <- annot_tableGene Symbol[annot_table$ID == probe_id]
cat(“基因符号:”, gene_symbol, “\n”)
}
}
检查您提到的探针
check_probe(“2315554”)
check_probe(“1007_s_at”)
3. 简化转换过程
simple_conversion <- function(expr_matrix, annot_table) {
创建映射表
probe2gene <- data.frame(
ProbeID = rownames(expr_matrix),
GeneSymbol = NA,
stringsAsFactors = FALSE
)
添加基因符号
for (i in 1:nrow(probe2gene)) {
probe_id <- probe2geneProbeID[i]if(probeidProbeID[i]
if (probe_id %in% annot_tableProbeID[i]if(probeidID) {
gene_symbol <- annot_table‘GeneSymbol‘[annottable`Gene Symbol`[annot_table‘GeneSymbol‘[annottableID == probe_id]
# 只取第一个基因符号
if (length(gene_symbol) > 0) {
gene_symbol <- strsplit(as.character(gene_symbol), " /// ")[[1]][1]
probe2gene$GeneSymbol[i] <- gene_symbol
}
}
}
移除没有基因符号的探针
probe2gene <- probe2gene[!is.na(probe2gene$GeneSymbol), ]
聚合表达值
expr_subset <- expr_matrix[probe2geneProbeID,,drop=FALSE]aggexpr<−aggregate(exprsubset,by=list(Gene=probe2geneProbeID, , drop = FALSE]
agg_expr <- aggregate(
expr_subset,
by = list(Gene = probe2geneProbeID,,drop=FALSE]aggexpr<−aggregate(exprsubset,by=list(Gene=probe2geneGeneSymbol),
FUN = mean
)
设置行名为基因符号
rownames(agg_expr) <- agg_exprGeneaggexprGene agg_exprGeneaggexprGene <- NULL
return(agg_expr)
}
尝试转换
expr_32967_gene <- simple_conversion(expr_32967, annot_table)
expr_104786_gene <- simple_conversion(expr_104786, annot_table)
最终解决方案
如果所有方法都失败,我们可以直接使用探针ID进行分析:
1. 找到共同探针
common_probes <- intersect(rownames(expr_32967), rownames(expr_104786))
2. 合并表达矩阵
combined_expr <- cbind(
expr_32967[common_probes, ],
expr_104786[common_probes, ]
)
3. 定义批次变量
batch <- c(
rep(“GSE32967”, ncol(expr_32967)),
rep(“GSE104786”, ncol(expr_104786))
)
4. ComBat批次校正
library(sva)
corrected_expr <- ComBat(
dat = combined_expr,
batch = batch,
par.prior = TRUE
)
5. 创建整合数据集
integrated_data <- list(
expr = corrected_expr,
phenoData = rbind(pheno_32967, pheno_104786),
featureData = data.frame(
probe = common_probes,
row.names = common_probes
),
batch_info = batch
)
6. 保存整合数据集
saveRDS(integrated_data, “Integrated_Prostate_Cancer_Dataset_Probes.rds”)
这样您至少可以完成数据整合和批次校正,基因注释可以在后续分析中添加。
方法2:只保留第一个基因符号
probe_to_gene_first <- function(expr_matrix, annot_table) {
提取探针ID和基因符号
probe2gene <- annot_table[, c(“ID”, “Gene Symbol”)]
colnames(probe2gene) <- c(“ProbeID”, “GeneSymbol”)
清洗基因符号(去除空值和无效值)
probe2gene <- probe2gene[!is.na(probe2geneKaTeX parse error: Expected 'EOF', got '&' at position 13: GeneSymbol) &̲
…GeneSymbol != “” &
probe2gene$GeneSymbol != “—”, ]
只保留表达矩阵中存在的探针
common_probes <- intersect(probe2geneProbeID,rownames(exprmatrix))probe2gene<−probe2gene[probe2geneProbeID, rownames(expr_matrix)) probe2gene <- probe2gene[probe2geneProbeID,rownames(exprmatrix))probe2gene<−probe2gene[probe2geneProbeID %in% common_probes, ]
只保留第一个基因符号
probe2geneGeneSymbol<−sapply(strsplit(as.character(probe2geneGeneSymbol <- sapply(strsplit(as.character(probe2geneGeneSymbol<−sapply(strsplit(as.character(probe2geneGeneSymbol), " /// "),
function(x) x[1])
处理多个探针对应同一基因的情况
expr_subset <- expr_matrix[probe2geneProbeID,,drop=FALSE]aggexpr<−aggregate(exprsubset,by=list(Gene=probe2geneProbeID, , drop = FALSE]
agg_expr <- aggregate(
expr_subset,
by = list(Gene = probe2geneProbeID,,drop=FALSE]aggexpr<−aggregate(exprsubset,by=list(Gene=probe2geneGeneSymbol),
FUN = mean
)
设置行名为基因符号
rownames(agg_expr) <- agg_exprGeneaggexprGene agg_exprGeneaggexprGene <- NULL
return(agg_expr)
}
方法3:使用自定义规则处理复杂注释
probe_to_gene_custom <- function(expr_matrix, annot_table) {
提取探针ID和基因符号
probe2gene <- annot_table[, c(“ID”, “Gene Symbol”)]
colnames(probe2gene) <- c(“ProbeID”, “GeneSymbol”)
清洗基因符号(去除空值和无效值)
probe2gene <- probe2gene[!is.na(probe2geneKaTeX parse error: Expected 'EOF', got '&' at position 13: GeneSymbol) &̲
…GeneSymbol != “” &
probe2gene$GeneSymbol != “—”, ]
只保留表达矩阵中存在的探针
common_probes <- intersect(probe2geneProbeID,rownames(exprmatrix))probe2gene<−probe2gene[probe2geneProbeID, rownames(expr_matrix)) probe2gene <- probe2gene[probe2geneProbeID,rownames(exprmatrix))probe2gene<−probe2gene[probe2geneProbeID %in% common_probes, ]
处理多基因注释
probe2geneGeneSymbol<−sapply(probe2geneGeneSymbol <- sapply(probe2geneGeneSymbol<−sapply(probe2geneGeneSymbol, function(gene_str) {
# 如果包含"///“,则进行处理
if (grepl(” /// ", gene_str)) {
genes <- unlist(strsplit(gene_str, " /// "))
# 规则1: 优先选择没有连字符的基因
no_hyphen <- genes[!grepl("-", genes)]
if (length(no_hyphen) > 0) return(no_hyphen[1])
# 规则2: 选择最长的基因名
return(genes[which.max(nchar(genes))])
}
return(gene_str)
})
处理多个探针对应同一基因的情况
expr_subset <- expr_matrix[probe2geneProbeID,,drop=FALSE]aggexpr<−aggregate(exprsubset,by=list(Gene=probe2geneProbeID, , drop = FALSE]
agg_expr <- aggregate(
expr_subset,
by = list(Gene = probe2geneProbeID,,drop=FALSE]aggexpr<−aggregate(exprsubset,by=list(Gene=probe2geneGeneSymbol),
FUN = mean
)
设置行名为基因符号
rownames(agg_expr) <- agg_exprGeneaggexprGene agg_exprGeneaggexprGene <- NULL
return(agg_expr)
}
处理特定探针的注释
对于您提到的特定探针,我们可以手动处理:
手动处理特定探针的注释
handle_specific_probes <- function(expr_matrix) {
创建探针到基因的映射表
probe_map <- data.frame(
ProbeID = rownames(expr_matrix),
GeneSymbol = NA,
stringsAsFactors = FALSE
)
手动添加已知探针的映射
known_mappings <- list(
“2315554” = “SLC25A20”, # GSE104786中的探针
“1007_s_at” = “DISC1” # GSE32967中的探针
)
应用已知映射
for (probe_id in names(known_mappings)) {
if (probe_id %in% probe_mapKaTeX parse error: Expected '}', got 'EOF' at end of input: … probe_mapGeneSymbol[probe_map$ProbeID == probe_id] <- known_mappings[[probe_id]]
}
}
处理多基因注释
for (i in 1:nrow(probe_map)) {
if (is.na(probe_mapKaTeX parse error: Expected '}', got 'EOF' at end of input: … <- annot_tableGene Symbol[annot_tableID==probemapID == probe_mapID==probemapProbeID[i]]
if (length(gene_str) > 0 && grepl(" /// ", gene_str)) {
genes <- unlist(strsplit(gene_str, " /// "))
# 使用自定义规则选择基因
probe_map$GeneSymbol[i] <- genes[1] # 或者使用其他规则
}
}
}
移除没有基因符号的探针
probe_map <- probe_map[!is.na(probe_map$GeneSymbol), ]
处理多个探针对应同一基因的情况
expr_subset <- expr_matrix[probe_mapProbeID,,drop=FALSE]aggexpr<−aggregate(exprsubset,by=list(Gene=probemapProbeID, , drop = FALSE]
agg_expr <- aggregate(
expr_subset,
by = list(Gene = probe_mapProbeID,,drop=FALSE]aggexpr<−aggregate(exprsubset,by=list(Gene=probemapGeneSymbol),
FUN = mean
)
设置行名为基因符号
rownames(agg_expr) <- agg_exprGeneaggexprGene agg_exprGeneaggexprGene <- NULL
return(agg_expr)
}
完整的工作流程
1. 获取平台注释
gpl570 <- getGEO(“GPL570”, AnnotGPL = TRUE)
annot_table <- Table(gpl570)
2. 转换探针为基因符号(使用方法1)
expr_32967_gene <- probe_to_gene_multiple(expr_32967, annot_table)
expr_104786_gene <- probe_to_gene_multiple(expr_104786, annot_table)
3. 找到共同基因
common_genes <- intersect(rownames(expr_32967_gene), rownames(expr_104786_gene))
4. 合并表达矩阵
combined_expr <- cbind(
expr_32967_gene[common_genes, ],
expr_104786_gene[common_genes, ]
)
5. 定义批次变量
batch <- c(
rep(“GSE32967”, ncol(expr_32967_gene)),
rep(“GSE104786”, ncol(expr_104786_gene))
)
6. ComBat批次校正
library(sva)
corrected_expr <- ComBat(
dat = combined_expr,
batch = batch,
par.prior = TRUE
)
7. 创建整合数据集
integrated_data <- list(
expr = corrected_expr,
phenoData = rbind(pheno_32967, pheno_104786),
featureData = data.frame(
gene = common_genes,
row.names = common_genes
),
batch_info = batch
)
8. 保存整合数据集
saveRDS(integrated_data, “Integrated_Prostate_Cancer_Dataset.rds”)
9. 验证批次校正效果
pca_res <- prcomp(t(corrected_expr), scale. = TRUE)
plot(pca_resx[,1:2],col=as.factor(batch),pch=16,main="批次校正后PCA",xlab=paste0("PC1(",round(summary(pcares)x[, 1:2],
col = as.factor(batch),
pch = 16,
main = "批次校正后PCA",
xlab = paste0("PC1 (", round(summary(pca_res)x[,1:2],col=as.factor(batch),pch=16,main="批次校正后PCA",xlab=paste0("PC1(",round(summary(pcares)importance[2,1]*100, 1), “%)”),
ylab = paste0(“PC2 (”, round(summary(pca_res)$importance[2,2]*100, 1), “%)”))
legend(“topright”,
legend = unique(batch),
col = 1:length(unique(batch)),
pch = 16)
处理多基因注释的最佳实践
优先使用方法1(拆分多基因注释):
保留所有可能的基因注释
更全面地反映生物学信息
但可能导致基因数量增加
考虑后续分析需求:
如果进行差异表达分析,拆分多基因注释可能更合适
如果进行通路分析,可能需要更精确的基因注释
注释质量检查:
检查特定探针的注释
check_probe_annotation <- function(probe_id) {
annotation <- annot_table[annot_table$ID == probe_id, “Gene Symbol”]
cat(“探针”, probe_id, “的注释:”, annotation, “\n”)
}
check_probe_annotation(“2315554”)
check_probe_annotation(“1007_s_at”)
使用最新注释:
GEO平台注释可能过时
考虑使用最新数据库(如NCBI或Ensembl)进行重新注释
通过以上方法,您应该能够正确处理包含多基因注释的探针,并成功完成数据整合和批次校正。
3万+

被折叠的 条评论
为什么被折叠?



