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

如何一次性按正负载荷筛选各主成分(PC)对应的Top基因?

批量筛选各主成分的正/负载荷Top基因

问题分析

原代码只能逐个指定PC列处理,且无法区分载荷的正负方向。以下方案可以一次性处理所有PC列,分别筛选出每个PC的正载荷Top基因与负载荷Top基因,适配任意数量的PC列,同时保留载荷方向信息。

完整解决方案代码

library(tidyverse)

# 加载示例数据(实际使用时替换为你的数据框)
df <- structure(list(gene = c("SCML4", "RASGRP1", "RP1-47M23.3", "TIGIT", 
"IL2RB", "IKZF3"), PC1 = c(0.0976999752508752, 0.0963683648774497, 
0.0958379291214584, 0.095581364305455, 0.0953187100695565, 0.0952640683198088
), PC2 = c(0.0415177491122262, 0.0149616407858333, 0.0592932173696311, 
0.0490135176285661, 0.0666662088855938, 0.0652039968982664), 
    PC3 = c(-0.0480347151614553, -0.05574053153725, -0.04805364872616, 
    -0.0486181477818392, -0.0437832673958965, -0.0450981246281503
    )), row.names = c(NA, -6L), class = c("tbl_df", "tbl", "data.frame"
))

# 批量筛选各PC的正/负载荷Top基因(可修改n值调整取多少个Top基因)
top_genes_by_pc <- df %>%
  # 将所有PC列转为长格式,无需手动指定单个PC
  pivot_longer(-gene, names_to = "PC", values_to = "loading") %>%
  # 添加载荷方向标记(正/负)
  mutate(loading_direction = ifelse(loading > 0, "positive", "negative")) %>%
  # 按PC和载荷方向分组,确保每组独立筛选
  group_by(PC, loading_direction) %>%
  # 按载荷绝对值从大到小排序,保证取到贡献最显著的基因
  arrange(desc(abs(loading)), .by_group = TRUE) %>%
  # 取每组的Top N,示例取Top3,可改为10或其他数值
  slice_head(n = 3) %>%
  ungroup() %>%
  # 整理结果列顺序
  select(PC, loading_direction, gene, loading)

# 查看筛选结果
print(top_genes_by_pc)

代码关键步骤说明

  • pivot_longer(-gene, ...):自动识别所有非gene列(即PC列)转为长格式,适配任意数量的PC列,无需逐个指定。
  • mutate(loading_direction = ...):为每个载荷添加正负标记,实现正、负载荷的分离筛选。
  • group_by(PC, loading_direction):按主成分和载荷方向双重分组,确保每个PC的正、负基因分别筛选。
  • arrange(desc(abs(loading)), .by_group = TRUE):按载荷绝对值降序排序,保证优先选取对主成分贡献最大的基因。
  • slice_head(n = 3):提取每组的Top N基因,可根据需求修改n的数值(比如原代码中的10)。

示例输出

执行代码后会得到如下结构化结果,清晰展示每个PC的正/负Top基因及其载荷值:

# A tibble: 12 × 4
   PC    loading_direction gene          loading
   <chr> <chr>             <chr>            <dbl>
 1 PC1   positive          SCML4           0.0977
 2 PC1   positive          RASGRP1         0.0964
 3 PC1   positive          RP1-47M23.3     0.0958
 4 PC2   positive          IL2RB           0.0667
 5 PC2   positive          IKZF3           0.0652
 6 PC2   positive          RP1-47M23.3     0.0593
 7 PC3   negative          RASGRP1        -0.0557
 8 PC3   negative          TIGIT          -0.0486
 9 PC3   negative          RP1-47M23.3    -0.0481

适配下游富集分析的进一步处理

如果需要将结果拆分为单独的基因列表(比如每个PC的正/负基因分别作为富集分析的输入),可以添加以下代码:

# 将结果转换为嵌套列表,方便提取各PC的正/负基因
gene_lists <- top_genes_by_pc %>%
  group_nest(PC, loading_direction) %>%
  mutate(gene_list = map(data, pull, gene)) %>%
  select(PC, loading_direction, gene_list) %>%
  deframe()

# 提取PC1的正载荷基因列表
gene_lists[["PC1", "positive"]]
# 提取PC3的负载荷基因列表
gene_lists[["PC3", "negative"]]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 04:27:27