You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

生物专业者求助:R构建蛋白-菌株共现矩阵及相关技术疑问

解决R中细菌菌株-人类蛋白共现矩阵构建与排序问题

嘿,作为生物专业的同学,咱们用R处理这类互作数据其实不用搞复杂的元组操作,用tidyverse这套工具就能轻松搞定,还能避开你提到的sparse()函数的困惑(那个是Matrix包的sparseMatrix(),适合超大数据集,咱们小数据用常规方法更直观)。下面直接给你完整的解决方案,再一步步拆解细节:

完整可运行代码

先给你能直接复制跑的流程,后面再解释每一步:

# 先安装需要的包(第一次用的话运行这行)
install.packages(c("tidyverse", "pheatmap", "viridis"))

# 加载工具包
library(tidyverse)
library(pheatmap)
library(viridis)

# 你的样本数据(转成数据框比矩阵更方便后续操作)
human.uniprots <- c("P15311", "P0CG48", "Q8WYH8", "P42224", "Q9NXR8", "P40763", "P05067", "P60709", "Q9UDW1", "Q9H160", "Q9UKL0", "P26038", "P61244", "O95817", "Q09472", "P15311","P05067", "P60709", "Q9UDW1", "Q9H160")
strains <- rep(c("A", "B", "C", "C"), each = 5)
final <- data.frame(human.uniprots, strains)

# 1. 统计每个蛋白-菌株的互作次数
count_df <- final %>%
  count(human.uniprots, strains, name = "interaction_times")

# 2. 转换为你想要的宽格式矩阵,无互作的单元格补0
h.map <- count_df %>%
  pivot_wider(names_from = strains, values_from = interaction_times, values_fill = 0)

# 3. 计算每个蛋白互作的菌株数量,并按该数量降序排序
h.map <- h.map %>%
  # 统计有互作的菌株个数(不是总次数哦)
  mutate(interacted_strain_num = rowSums(select(., -human.uniprots) > 0)) %>%
  # 先按菌株数量降序,数量相同的按蛋白ID排序
  arrange(desc(interacted_strain_num), human.uniprots)

# 4. 生成可视化热图
heatmap_data <- h.map %>%
  column_to_rownames("human.uniprots") %>%
  select(-interacted_strain_num) # 去掉辅助列,只保留互作次数数据

pheatmap(heatmap_data,
         main = "Bacterial Strains vs Human Proteins Interaction Heatmap",
         xlab = "Bacterial Strains",
         ylab = "Human Uniprot IDs",
         color = viridis(10), # 用viridis颜色,色盲友好
         cellwidth = 40, cellheight = 20) # 调整单元格大小适配你的数据

关键步骤拆解

1. 数据预处理

把你用cbind生成的矩阵转成data.frame,因为矩阵只能存同类型数据,而数据框更适合后续的统计操作。

2. 统计互作次数

用dplyr::count()直接统计每个蛋白-菌株组合的出现次数,自动生成interaction_times列,这比手动匹配元组高效太多,完全不用纠结元组操作。

3. 转宽格式矩阵

tidyr::pivot_wider()是核心:把长格式的统计数据转换成你想要的“行=蛋白,列=菌株”的矩阵格式,values_fill = 0会自动把没有互作的单元格补0,完美符合你的需求。

4. 按互作菌株数量排序

这里要注意:我们要统计的是蛋白与多少种不同菌株互作,而不是总互作次数。所以用rowSums(select(., -human.uniprots) > 0):先筛选掉蛋白ID列,然后判断每个菌株列是否有互作(值>0),求和后得到该蛋白的互作菌株总数。最后用arrange(desc(...))降序排列,这样和所有菌株互作的蛋白就会排在最前面。

5. 热图可视化

用pheatmap生成热图,先把蛋白ID转成行名,去掉辅助的统计列,再设置标题、坐标轴标签和色盲友好的viridis颜色方案,生成的图清晰直观,适合展示给导师或用于论文。

关于sparse()函数的说明

你看到的sparse()应该是Matrix包的sparseMatrix(),它主要用来处理百万级以上的超大矩阵,目的是节省内存。但咱们的数据集很小,用常规的宽格式矩阵完全够用,而且更易读、易调试,没必要用稀疏矩阵。

内容的提问来源于stack exchange,提问作者potato

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:58:01