在R中用tidyverse筛选:至少2个组中有效值≥2的基因
基于tidyverse筛选符合条件的基因
需求说明
现有表格包含三列:基因(特征)、分组、有效值数量(notNA)。需要筛选出在至少2个分组中notNA≥2的基因,并输出以下信息:
- 基因名
- 有效分组总数(满足notNA≥2的分组数量)
- 有效分组列表(用分号分隔满足条件的分组名)
示例数据
library(tidyverse) df <- data.frame( gene = c('A', 'A', 'A', 'B','B','B', 'C','C','C'), group = c('a', 'b', 'c', 'a', 'b' ,'c', 'a', 'b' ,'c'), notNA = c(1, 2, 3, 1, 1, 2, 2, 3, 4) ) # 预期输出结果 expected_result <- data.frame( gene = c('A', 'C'), total_valid_groups = c(2, 3), valid_groups = c('b;c', 'a;b;c') )
tidyverse解决方案
result <- df %>% # 按基因分组,针对单个基因的所有分组数据进行处理 group_by(gene) %>% # 筛选当前基因下notNA≥2的分组记录 filter(notNA >= 2) %>% # 汇总有效分组的数量和列表 summarise( total_valid_groups = n(), valid_groups = str_c(group, collapse = ";") ) %>% # 保留有效分组数≥2的基因 filter(total_valid_groups >= 2) %>% # 取消分组状态,转换为普通数据框 ungroup() print(result)
代码解释
group_by(gene):按基因维度分组,确保后续操作只针对单个基因的分组数据filter(notNA >= 2):筛掉当前基因下有效值数量不达标的分组summarise(...):对每个基因的有效分组做统计,记录数量并拼接分组名称filter(total_valid_groups >= 2):最终筛选出满足“至少2个有效分组”条件的基因ungroup():解除分组状态,让结果回归标准数据框格式
运行后得到的结果与expected_result完全一致。
内容的提问来源于stack exchange,提问作者Sebastian Hesse
相关产品推荐
相关产品推荐

