问题
我参考了这篇文章处理了我的RNA-seq数据,导出了.csv文件。https://zhuanlan.zhihu.com/p/359012216
然后我想用CIBERSORT做免疫浸润分析,于是将该基因表达文件导出为.txt,但是在我使用CIBERSORT.R时,一直报错:
source('Cibersort.R')
LM22.file <- "LM22.txt"
TCGA_exp.file <- "DATA.txt"
TCGA_TME.results <- CIBERSORT(LM22.file ,TCGA_exp.file, perm = 50, QN = F)
寻找原因
我在R中使用debug,发现问题不出现在LM22.txt,即LM22.file这个表格的rownames是没有重复没有问题的,问题出现在我的基因表达矩阵里,出于便捷,我直接在excel中寻找第一列的重复值,没有检索到重复值。(这里我居然相信了可恶的excel,于是我重新debug,网上找了好多办法和代码,走了很多弯路…)
别的道路走不通,于是我重新寻找这个重复的列名,借助chatGPT写了段寻找重复列名的代码(顺便把检查空值的代码也写了,感谢ai):
#导入RNA-seq.txt文件
setwd("C:\\Users\\...\\")#此处...省略文件路径
TCGA_exp.file <- "DATA.txt"
data <- read.table(TCGA_exp.file, header = TRUE, sep = "\t", stringsAsFactors = FALSE, check.names = F)
# 提取第一列(行名)
rownames_column <- data[, 1]
# 检查重复值
duplicated_rows <- any(duplicated(rownames_column))
if (duplicated_rows) {
cat("存在重复的行名。\n")
# 打印重复的行名
duplicated_values <- rownames_column[duplicated(rownames_column)]
print(duplicated_values)
# 使用which函数找到特定行名的行数
row_numbers <- which(rownames_column == duplicated_values)
# 输出行数,好像只能报出其中一个行数,但也够我看看是何方神圣阻挡我取经的道路!
print(row_number)
} else {
cat("没有重复的行名。\n")
}
# 检查空值
empty_rows <- any(rownames_column == "")
if (empty_rows) {
cat("存在空的行名。\n")
# 打印空值的行索引
empty_row_indices <- which(rownames_column == "")
print(empty_row_indices)
} else {
cat("没有空的行名。\n")
}
找到了,是这个家伙!
我打开excel,额…发现是日期😓 (我真的会谢!
解决方案
1、检索了很多方式,这篇文章写的蛮全面的,大伙可以参考学习学习:
https://blog.csdn.net/m0_72224305/article/details/130785362
2、chat-gpt老师也提供了一个方案:
要在导出为Excel文件时避免基因名称被篡改,可以在导出之前使用R语言对基因名称进行处理。以下是一个示例代码,展示了如何在导出数据时避免基因名称被篡改:
1.假设您的RNA-seq数据存储在一个名为“RNA_data”的数据框中。
2.在导出数据之前,使用gsub函数替换所有可能引起混淆的基因名称。以下是一个示例,用于替换所有包含“Mar”的基因名称。
3.导出修复后的数据到Excel文件。
# 替换包含"Mar"的基因名称
RNA_data$Gene.Symbol <- gsub("Mar", "MARC", RNA_data$Gene.Symbol)
# 导出数据到Excel文件
write.xlsx(RNA_data, "RNA_data_fixed.xlsx", sheet_name = "Sheet1", append = FALSE)
3、我没有试上述的方案,我选择直接避免使用excel~
write.table(TCGA_gset, "C:\\Users\\...\\TCGA_HNSC_fpkmdata_log2+1.txt", sep ="\t", quote =FALSE)
#sep:分隔符,默认为空格(” “),也就是以空格为分割列
#quote:字符串是否使用引号表示,默认为TRUE,也就是使用引号表示