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

如何在多个DataFrame中识别基因的共有与独有组合并进行分组处理

解决方案:识别多对比组中的基因分布与分组提取

看起来你已经拿到了关键的宽格式数据,咱们可以基于它或者直接从原始的result_abd列表入手,轻松解决这两个问题。下面分步骤给你拆解:


1. 识别所有可能组合中出现的基因(含仅部分组存在的基因)

你有两种思路可以选择,一种是基于你已有的宽格式结果,另一种是从原始的result_abd列表重新处理,两种都能帮你理清每个基因的分布情况:

方法一:基于你现有的宽格式数据框(假设名为wide_df)

library(tidyverse)

# 1. 统计每个基因存在的组数量,以及具体属于哪些组
gene_distribution <- wide_df %>%
  rowwise() %>%
  mutate(
    # 统计非NA的列数(即该基因存在的组数量)
    group_count = sum(!is.na(c_across(-gene))),
    # 提取所有存在该基因的组名称(去掉NA)
    present_groups = list(na.omit(c_across(-gene)))
  ) %>%
  ungroup()

# 查看结果:每个基因对应存在的组列表和数量
head(gene_distribution)

方法二:直接从原始result_abd列表处理

如果你的原始列表更方便操作,可以用这种方式先合并数据再统计:

library(tidyverse)

# 1. 给每个子数据框添加分组名称,然后合并成一个长表
all_genes_long <- map2_dfr(result_abd, names(result_abd),
                           ~ .x %>% mutate(group = .y))

# 2. 按基因分组,汇总所属的所有组和数量
gene_distribution <- all_genes_long %>%
  group_by(gene) %>%
  summarise(
    present_groups = list(unique(group)),
    group_count = n_distinct(group)
  ) %>%
  ungroup()

这样得到的gene_distribution会包含所有基因,不管它只在1个组还是多个组出现,完美解决你需要识别所有组合中基因的需求。


2. 提取多组中存在的基因,生成无NA的新DataFrame

这里我们以“提取存在于2个及以上组的基因”为例,你可以根据需求修改阈值(比如改成7,就能筛选出像ENSG00000000971这样的基因):

方式一:从宽格式数据生成无NA结果(长格式更易读)

# 1. 先筛选出符合条件的基因(这里选存在≥2个组的)
target_genes <- gene_distribution %>%
  filter(group_count >= 2) %>%
  pull(gene)

# 2. 转换为长格式并去掉NA,得到无缺失的结果
no_na_result <- wide_df %>%
  filter(gene %in% target_genes) %>%
  pivot_longer(-gene, names_to = "group", values_to = "group_name") %>%
  filter(!is.na(group_name)) %>%
  select(gene, group = group_name)

# 查看示例结果
head(no_na_result)

方式二:从原始列表直接提取生成无NA数据

# 用上面得到的target_genes,从原始列表中筛选并合并
no_na_result <- result_abd %>%
  map(~ .x %>% filter(gene %in% target_genes)) %>%
  imap_dfr(~ .x %>% mutate(group = .y)) %>%
  select(gene, group)

如果你偏好宽格式(只保留有值的列),也可以这样处理:

wide_no_na <- wide_df %>%
  filter(gene %in% target_genes) %>%
  # 只保留至少有一个非NA值的列
  select(gene, where(~ any(!is.na(.x)))) %>%
  # 将NA替换为空字符串(可选)
  mutate(across(-gene, ~ ifelse(is.na(.x), "", .x)))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 23:52:31