求助:在R语言中整理疾病共现数据并绘制实际值热图
疾病共现交叉表与热图实现(R语言)
1. 数据预处理
先确保你的数据集是患者-疾病的长格式(每行对应一个患者的一种疾病),去除重复记录避免同一患者同一疾病被多次统计:
# 加载必要工具包 library(tidyverse) # 替换为你的实际数据集 # data <- read.csv("your_data.csv") # 去重:同一患者同一疾病仅保留一条记录 data <- unique(data)
2. 生成疾病共现交叉表
将数据转换为二进制矩阵(行=患者,列=疾病,值为1表示患病、0表示未患病),再通过矩阵交叉乘积计算两种疾病的共现人数:
# 转换为患者-疾病二进制矩阵 disease_matrix <- data %>% mutate(flag = 1) %>% pivot_wider(names_from = Condition, values_from = flag, values_fill = 0) %>% select(-person_id) %>% as.matrix() # 计算共现交叉表:单元格值为同时患两种疾病的患者数量 co_occur_table <- tcrossprod(disease_matrix) # 可选:若无需显示单个疾病的总患病人数(对角线值),可将其设为NA # diag(co_occur_table) <- NA
3. 绘制展示实际统计值的热图
方法1:用ggplot2自定义绘制
将交叉表转为长格式后,结合色块与文本直观展示共现人数:
# 转换为ggplot兼容的长格式 co_occur_long <- co_occur_table %>% as.data.frame() %>% rownames_to_column("疾病A") %>% pivot_longer(cols = -`疾病A`, names_to = "疾病B", values_to = "共现人数") # 绘制热图 ggplot(co_occur_long, aes(x = `疾病A`, y = `疾病B`, fill = `共现人数`)) + geom_tile(color = "white") + geom_text(aes(label = `共现人数`), size = 4, color = "black") + scale_fill_gradient(low = "#e6f2ff", high = "#003366") + theme_minimal() + theme(axis.text.x = element_text(angle = 45, hjust = 1)) + labs(title = "疾病共现人数热图")
方法2:用pheatmap快速绘制
pheatmap可直接处理矩阵,自带数值显示功能,操作更简洁:
library(pheatmap) pheatmap(co_occur_table, display_numbers = TRUE, # 显示实际共现人数 number_color = "black", color = colorRampPalette(c("#e6f2ff", "#003366"))(100), main = "疾病共现人数热图", angle_col = 45)
内容的提问来源于stack exchange,提问作者Philip
相关产品推荐
相关产品推荐

