在R中如何对比分组重复行并计算组内统计指标?
针对分组基因数据集的统计分析解决方案
嗨,我看你正在处理按ID分组的基因Score数据集,想要计算几个特定的统计占比,已经尝试了duplicated()和filter()但不知道接下来该用什么函数对吧?别担心,用dplyr这套工具就能轻松搞定,我给你一步步拆解:
首先先把你的输入数据放出来方便后续操作:
df <- structure(list(ID = c("1:10", "1:10", "1:10", "2:20", "2:20", "3:30", "3:30", "3:30"), Gene = c("Gene1", "Gene1", "Gene4", "Gene5", "Gene6", "Gene7", "Gene8", "Gene8"), Score = c(0.8, 0.78, 0.6, 0.1, 0.7, 0.4, 0.6, 0.5)), row.names = c(NA, -8L), class = c("data.table", "data.frame"))
第一个统计指标:组内拥有1个以上Score>0.7的基因的ID组占比
思路:同一个Gene可能对应多个Score(比如ID1:10里的Gene1有两个Score),我们只需要判断每个Gene在对应ID组里是否至少有一个Score>0.7,然后统计有多少个ID组满足“这样的基因数量≥1”,最后除以总ID数得到占比。
对应的代码实现:
library(dplyr) # 第一步:按ID+Gene分组,标记每个基因是否存在Score>0.7的记录 gene_level_check <- df %>% group_by(ID, Gene) %>% summarise(has_high_score = any(Score > 0.7), # any()判断组内是否存在符合条件的元素 .groups = "drop") # 取消分组 # 第二步:按ID分组,统计每个ID下满足条件的基因数量 id_level_count <- gene_level_check %>% group_by(ID) %>% summarise(high_score_gene_num = sum(has_high_score), # sum()对逻辑值求和,TRUE=1,FALSE=0 .groups = "drop") # 第三步:计算占比,mean()直接计算逻辑向量的平均值就是占比 ratio_high_score <- mean(id_level_count$high_score_gene_num >= 1) * 100 cat("组内拥有1个以上Score>0.7的基因的ID组占比:", round(ratio_high_score, 1), "%\n") # 输出结果就是示例中的33.3%
这里核心用到的函数:
group_by():用来按指定字段(ID、Gene)分组,是后续聚合操作的基础summarise():对分组后的数据做聚合计算,生成新的统计列any():判断分组内是否存在至少一个满足条件的元素,返回逻辑值mean():对逻辑向量求平均,直接得到符合条件的ID组占比(非常实用的小技巧)
第二个统计指标:同时存在Score=0.7和Score=0.1的基因的ID组占比
思路:直接按ID分组,判断每个组内是否同时存在Score=0.1的记录和Score=0.7的记录,然后统计符合条件的ID数量,除以总ID数得到占比。
对应的代码实现:
# 第一步:按ID分组,标记每个组是否包含Score=0.1和Score=0.7 id_condition_check <- df %>% group_by(ID) %>% summarise(has_score_01 = any(Score == 0.1), has_score_07 = any(Score == 0.7), .groups = "drop") # 第二步:筛选同时满足两个条件的ID组,计算占比 qualified_ids <- id_condition_check %>% filter(has_score_01 & has_score_07) ratio_double_condition <- (nrow(qualified_ids) / length(unique(df$ID))) * 100 cat("同时存在Score=0.7和Score=0.1的基因的ID组占比:", round(ratio_double_condition, 1), "%\n") # 输出结果就是示例中的33.3%
小提示:
如果你的数据存在浮点精度问题(比如Score实际存储为0.7000001或0.6999999),建议用dplyr::near(Score, 0.7, tol = 1e-6)代替Score == 0.7,避免因为浮点误差导致判断错误。
内容的提问来源于stack exchange,提问作者DN1
相关产品推荐
相关产品推荐

