R语言基于数据框数值列查询样本跨重复批次的分组重叠情况
解决方法
核心逻辑是统计任意两个样本在所有重复批次中被分到同一组的次数,次数越高说明分组稳定性越强,具体实现步骤如下:
1 统计样本两两共组次数
通过遍历所有重复批次,对每批次中同组的样本对进行计数,最终生成共现次数矩阵:
# 提取样本名 samples <- df$names n <- length(samples) # 初始化共组次数矩阵,行、列均为样本名,值为共组次数 co_occur <- matrix(0, nrow = n, ncol = n, dimnames = list(samples, samples)) # 遍历每一个重复批次 for (rep_col in paste0("rep", 1:4)) { # 按当前批次的组号拆分样本 group_list <- split(df$names, df[[rep_col]]) # 对每个组内的样本两两配对,计数加1 for (g in group_list) { if (length(g) >=2) { pairs <- combn(g, 2) for (i in 1:ncol(pairs)) { s1 <- pairs[1,i] s2 <- pairs[2,i] co_occur[s1, s2] <- co_occur[s1, s2] + 1 co_occur[s2, s1] <- co_occur[s2, s1] + 1 } } } } # 对角线为样本自身对比,无统计意义,设为NA diag(co_occur) <- NA
2 结果解读
矩阵中的值范围为0到4(对应4个重复批次),值越高说明两个样本的共组频率越高:
- 值为4:两个样本在所有重复中都被分到同一组,属于完全稳定的配对
- 值越高,两个样本的分组关联性越强
如果需要筛选高稳定性的样本对,可直接按阈值过滤:
# 筛选共组次数≥3的样本对 which(co_occur >= 3, arr.ind = TRUE)
3 挖掘稳定分组簇
如果需要找到多个样本组成的稳定分组,可以基于共现矩阵做层次聚类,将高频共组的样本聚为一类:
# 共现次数转距离矩阵,共组次数越高距离越小 dist_mat <- as.dist(4 - co_occur) # 层次聚类 hc <- hclust(dist_mat, method = "average") # 绘制聚类树直观查看分组结构 plot(hc, xlab = "样本名", ylab = "距离(值越小共组次数越多)")
比如你举的例子中rep1里A、E、H同属组2,查看矩阵对应值就能看到:A和H的共组次数为2(rep1、rep2均同组),A和E的共组次数仅为1(仅rep1同组),说明A和H的分组稳定性更高。
内容的提问来源于stack exchange,提问作者Adn
相关产品推荐
相关产品推荐

