生物专业者求助: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

