如何生成两个不同ES分组间的两两对比组合列表?
生成跨组ES两两组合的方法
你需要的是不同组(dat2和dat3)之间的ES值两两组合,而非同一组内的组合,直接用combn从所有ES里取两两配对会包含同组的,所以可以分两种思路实现:
方法一:直接基于原始两组生成交叉组合
这种方式最直接,因为你已经明确dat2和dat3是两个独立分组:
# 分别提取两个数据框的唯一ES值 es_from_dat2 <- unique(dat2$ES) # 结果是 c(3,4,5) es_from_dat3 <- unique(dat3$ES) # 结果是 c(8,9,10) # 生成两组之间的所有交叉配对,转成你需要的列表格式 cross_combs <- expand.grid(es_from_dat2, es_from_dat3) ES_cross_combs <- lapply(1:nrow(cross_combs), function(i) as.numeric(cross_combs[i,]))
运行后ES_cross_combs里就只有跨组的组合,比如c(3,8)、c(3,9)这类,完全排除了同组的c(3,4)、c(4,5)。
方法二:基于合并后的数据框过滤
如果后续分组规则可能变化,也可以在合并数据时标记分组,再过滤组合:
# 合并时给每个数据框标记分组 dat4 <- rbind( transform(dat2, group = "group1"), transform(dat3, group = "group2") ) # 先获取每个ES对应的分组信息 es_group_map <- unique(dat4[, c("ES", "group")]) # 先生成所有两两组合,再过滤掉同组的 all_es_combs <- combn(unique(dat4$ES), 2, simplify = FALSE) ES_cross_combs <- Filter(function(pair) { # 取当前组合两个ES对应的分组 g1 <- es_group_map$group[es_group_map$ES == pair[1]] g2 <- es_group_map$group[es_group_map$ES == pair[2]] # 只保留分组不同的组合 g1 != g2 }, all_es_combs)
两种方法都能得到你需要的跨组两两组合,选哪种看你的实际需求场景。
内容的提问来源于stack exchange,提问作者Hard_Course
相关产品推荐
相关产品推荐

