在R中计算基因表达相关矩阵用于Cytoscape时遇报错求解决
问题根源
你报错的核心原因是:原始数据里的Samples列是字符型(存的是A-1、B-2这类样本名),直接转置整个数据框后,这列内容变成了transposed_df的一行,导致数据框混进非数值类型,而cor()函数要求输入必须全为数值,因此触发错误。
修正方案&完整代码
先把样本名设为行名,移除字符型列,再计算相关性,最后导出适配Cytoscape的格式:
# 先安装所需包(未安装时执行以下注释行) # install.packages("openxlsx") # install.packages("Hmisc") # install.packages("tidyr") # install.packages("dplyr") library(openxlsx) library(Hmisc) library(tidyr) library(dplyr) # 你的原始数据 df2 <- structure(list(Samples = c("A-1", "A-2", "A-4", "B-1", "B-2", "B-4", "C-1", "C-2", "C-4"), gene1 = c(1.92240792088036, 1.87118633447253, 1.94158574768122, 0.743982725531221, 0.986224813365175, 0.476215748248648, 0.731490064245346, 0.596064876825191, 0.571791594329927), gene2 = c(1.38762620120341, 4.66680898951508, 2.87307760165737, 0.998905293967859, 1.58490494045631, 1.07311974444822, 4.88661528392309, 3.35118753924545, 6.52812574494532 ), gene3 = c(2.75218521855555, 1.96606424938052, 1.26134206679715, 0.248847419775807, 0.216994140810077, 0.381075639652472, 0.614240099166926, 0.346259723181132, 0.501984000812794)), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, -9L)) # 1. 预处理:将样本名设为行名,移除字符型Samples列,保留纯数值基因数据 df_numeric <- df2 %>% column_to_rownames(var = "Samples") # 2. 计算基因间Spearman相关性矩阵 cor_matrix <- cor(df_numeric, method = "spearman") # 3. 批量计算相关性对应的p值(Hmisc包的rcorr函数可同时输出系数和p值) cor_results <- rcorr(as.matrix(df_numeric), type = "spearman") p_matrix <- cor_results$P # 4. 整理为Cytoscape可用的边列表格式(过滤重复基因对) edge_list <- cor_matrix %>% as.data.frame() %>% rownames_to_column("Gene1") %>% pivot_longer(-Gene1, names_to = "Gene2", values_to = "Correlation") %>% # 合并p值数据 left_join( p_matrix %>% as.data.frame() %>% rownames_to_column("Gene1") %>% pivot_longer(-Gene1, names_to = "Gene2", values_to = "P_value"), by = c("Gene1", "Gene2") ) %>% # 保留非重复的基因对,移除基因自身相关 filter(Gene1 < Gene2) # 5. 导出数据 write.xlsx(t(df_numeric), "Transposed_Gene_Data.xlsx") # 转置后的基因表达数据 write.xlsx(list(Correlation_Matrix = cor_matrix, P_Value_Matrix = p_matrix), "Correlation_Results.xlsx") # 相关性与p值矩阵 write.xlsx(edge_list, "Cytoscape_Edge_List.xlsx") # 可直接导入Cytoscape的边列表
关键提示
- 核心修正点:必须先移除字符型的
Samples列,确保输入cor()的是纯数值数据,这是解决报错的关键。 - Cytoscape适配:导出的
Cytoscape_Edge_List.xlsx可直接导入工具,导入时可将Correlation设为边的权重,P_value用于筛选显著相关的基因对。
内容的提问来源于stack exchange,提问作者A.Mokhtari
相关产品推荐
相关产品推荐

