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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 10:22:34