R语言处理差异比较基因数据:分组筛选非NA基因集及minDF/maxDF含义咨询
帮你解决这两个问题哈
先澄清minDF和maxDF的真实含义
你那段代码里的df列是bind_rows(.id="df")自动生成的,它代表的是你原始输入的每个数据框的序号——比如第一个输入的M0_vs_M1_TCGA_stages对应df=1,第二个M0_vs_M2_TCGA_stages对应df=2,以此类推。所以第一行的1和5,意思是这个基因在第1到第5个原始数据框里都有出现,可不是最终宽表的第1、5列哦,你之前的理解有点偏差啦。
实现按基因的非NA列集合分组的方案
你的核心需求是把基因按它们存在的对比组(也就是宽表里非NA的列)分组,每组内的基因的非NA列完全一致。我给你整理了一套可行的步骤:
步骤1:给每个基因标记专属的非NA列集合
从你已经得到的宽表a出发,我们先转成长格式筛选非NA行,再聚合每个基因对应的对比组集合:
library(dplyr) library(tidyr) gene_groups <- a %>% # 把宽表转成长格式,保留基因列,其他列转成对比组和存在标记 pivot_longer(cols = -gene, names_to = "comparison", values_to = "present") %>% # 只保留非NA的行(也就是基因存在的对比组) filter(!is.na(present)) %>% # 按基因分组,把对应的对比组整理成排序后的列表(排序是为了避免顺序不同导致分组错误) group_by(gene) %>% summarise(comparison_set = list(sort(comparison))) %>% ungroup() %>% # 按对比组集合分组,给每个组分配唯一ID group_by(comparison_set) %>% mutate(group_id = cur_group_id()) %>% ungroup()
步骤2:查看分组结果
现在gene_groups里每个基因都绑定了对应的分组ID和对比组集合,你可以生成清晰的分组汇总:
group_summary <- gene_groups %>% group_by(group_id) %>% summarise( 包含的基因 = list(gene), 对应的对比组 = first(comparison_set) ) %>% ungroup() # 打印前10组的结果看看 print(group_summary, n = 10)
步骤3:生成类似预期的表格格式
如果想要得到和你预期一样的表格(每行一个基因,列是对比组,标记是否存在),可以再做一步转换:
final_table <- gene_groups %>% # 生成所有对比组的笛卡尔积,确保每个基因对应所有对比组 crossing(comparison = unique(a %>% select(-gene) %>% colnames())) %>% # 标记该基因在这个对比组是否存在 mutate(是否存在 = ifelse(comparison %in% unlist(comparison_set), "是", "否")) %>% # 转回宽表格式 pivot_wider(names_from = comparison, values_from = 是否存在) %>% # 调整列顺序,把分组ID和基因列放前面 select(group_id, gene, everything())
这样处理后,你就能完美得到按非NA列分组的基因集合,每组内的基因对应的非NA列完全一致啦。
内容的提问来源于stack exchange,提问作者PesKchan
相关产品推荐
相关产品推荐

