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

求助:在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 01:16:16