使用tidyverse对group_by生成的分组求多组间feature交集
解决方案
你遇到的错误核心原因有两点:
group_by()后的mutate()是分组内独立运算,每次只能拿到当前分组的feature向量,无法访问其他分组的元素,自然无法求跨组交集- 基础
intersect()函数仅支持传入两个向量求交集,单参数调用必然报错
实现代码
library(tidyverse) # 示例数据生成(加随机种子方便结果复现) set.seed(123) data <- tibble( feature = paste0("Group_", sample(1:800, 1000, replace = T)), classifier = paste0("Classifier_", sample(1:3, 1000, replace = T)) ) # 求所有classifier分组的共有feature common_features <- data %>% # 先去重,避免同分组内重复feature干扰结果 distinct(classifier, feature) %>% # 按classifier分组,将每个分组的feature汇总为列表 group_by(classifier) %>% summarise(feature_set = list(feature)) %>% # 提取所有分组的feature列表 pull(feature_set) %>% # 迭代对所有列表元素求交集,支持任意数量分组 Reduce(intersect, .)
运行后common_features就是所有分组共有的feature值。如果需要把交集标记回原数据,可以补充以下代码:
data <- data %>% mutate(is_common = feature %in% common_features)
原理说明
Reduce()函数可以将指定函数(这里是intersect)迭代作用到列表的所有元素上,完美解决intersect只能接收两个参数的问题,同时支持任意数量的分组,无需手动调整参数- 提前用
distinct()去重可以减少无效运算,也避免同分组内重复值影响交集判断
内容的提问来源于stack exchange,提问作者sarah-lital
相关产品推荐
相关产品推荐

