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

