如何用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
相关产品推荐
相关产品推荐

