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

如何用tidyr对重复数据取平均并绘制带树状图的热图与PCA

嘿,我来一步步帮你搞定这个从数据整理到可视化的全流程,用R的tidyr、dplyr还有常用的可视化包就能轻松实现~


步骤1:数据整理与生物学重复取平均值

首先我们需要把你的宽格式数据转换成更易处理的长格式,拆分样本信息后按基因、基因型、时间点分组,计算生物学重复的平均值:

# 加载必备包
library(tidyr)
library(dplyr)
library(pheatmap)
library(ggplot2)

# 假设你的原始数据框名为df
# 1. 宽格式转长格式,提取样本信息
df_long <- df %>%
  pivot_longer(cols = -Gene, names_to = "Sample_ID", values_to = "Expression") %>%
  # 拆分Sample_ID为基因型、时间点、重复三个字段
  separate(Sample_ID, into = c("Genotype", "Timepoint", "Replicate"), sep = "_")

# 2. 按基因、基因型、时间点分组,计算平均表达量
df_avg <- df_long %>%
  group_by(Gene, Genotype, Timepoint) %>%
  summarise(Avg_Expression = mean(Expression), .groups = "drop")

# 3. 转成热图需要的宽格式(基因作为行,合并后的基因型-时间点作为列)
heatmap_ready_data <- df_avg %>%
  unite(Sample, Genotype, Timepoint, sep = "_") %>%
  pivot_wider(names_from = Sample, values_from = Avg_Expression) %>%
  column_to_rownames("Gene")

步骤2:绘制带树状图的热图

用pheatmap包可以直接生成带行/列聚类树状图的热图,默认就会包含树状图,还能灵活调整参数:

pheatmap(heatmap_ready_data,
         scale = "row",  # 按基因标准化表达量,可选"column"或"none"
         clustering_distance_rows = "euclidean",  # 行聚类的距离计算方式
         clustering_distance_cols = "euclidean",  # 列聚类的距离计算方式
         clustering_method = "ward.D2",  # 聚类方法,常用ward.D2做层次聚类
         main = "Gene Expression Heatmap (Average of Biological Replicates)",
         show_rownames = TRUE,  # 显示基因名
         show_colnames = TRUE,  # 显示样本名
         cellwidth = 25, cellheight = 8)  # 调整单元格大小适配你的数据量

步骤3:PCA分析与可视化

PCA需要把样本作为行、基因作为列,我们基于平均后的表达量来做分析:

# 1. 转置数据(样本行,基因列),并做PCA(标准化数据消除基因表达量级差异)
pca_input <- t(heatmap_ready_data)
pca_result <- prcomp(pca_input, scale. = TRUE)

# 2. 提取前两个主成分的结果,添加分组信息
pca_plot_data <- as.data.frame(pca_result$x[, 1:2]) %>%
  rownames_to_column("Sample") %>%
  separate(Sample, into = c("Genotype", "Timepoint"), sep = "_")

# 3. 计算主成分的方差解释率
pc1_var <- round(pca_result$sdev[1]^2 / sum(pca_result$sdev^2) * 100, 1)
pc2_var <- round(pca_result$sdev[2]^2 / sum(pca_result$sdev^2) * 100, 1)

# 4. 绘制PCA散点图
ggplot(pca_plot_data, aes(x = PC1, y = PC2, color = Genotype, shape = Timepoint)) +
  geom_point(size = 3, alpha = 0.8) +
  labs(title = "PCA of Gene Expression Profiles",
       x = paste0("PC1 (", pc1_var, "%)"),
       y = paste0("PC2 (", pc2_var, "%)")) +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5, size = 14))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:45:42