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

如何让R中Complex Upset侧边栏为总条目、顶部单交集栏为专属条目?

解决Complex Upset中inclusive_intersection模式下的计数显示问题

要实现侧边栏显示集合总条目数、单集合交集栏显示仅属于该集合的条目数,核心是自定义交集计数逻辑,同时保留默认的集合大小统计。以下是具体实现步骤:

1. 准备自定义计数函数

先定义一个函数,专门计算仅属于单个集合的元素数量(即该元素仅在目标集合中标记为TRUE,其他所有集合均为FALSE):

calculate_unique_members <- function(data, target_set) {
  # 获取所有集合列
  all_set_cols <- colnames(data)[sapply(data, is.logical)]
  # 计算当前行在所有集合中的命中数
  total_hits <- rowSums(data[, all_set_cols, drop = FALSE])
  # 筛选:属于目标集合,且仅命中这一个集合的行
  sum(data[[target_set]] & total_hits == 1)
}

2. 调用ComplexUpset并配置自定义统计

使用intersection_counts参数区分单集合和多集合的计数逻辑:单集合用自定义的独有元素计数,多集合保留inclusive_intersection模式的默认计数;同时保留默认的侧边栏集合大小统计。

以内置的movies数据集为例:

library(ComplexUpset)
library(ggplot2)
data(movies)

ComplexUpset(
  movies,
  c('Action', 'Comedy', 'Drama'),
  mode = 'inclusive_intersection',
  # 自定义交集计数规则
  intersection_counts = list(
    # 单集合时使用独有元素计数
    single = function(data, sets) calculate_unique_members(data, sets),
    # 多集合时保留inclusive模式的交集计数(即同时属于所有指定集合的元素,不管是否在其他集合)
    multi = function(data, sets) sum(rowSums(data[, sets, drop = FALSE]) == length(sets))
  ),
  # 侧边栏保持默认的集合总大小统计
  set_sizes = upset_set_size()
)

效果说明

  • 侧边栏(Set Size):显示对应集合的总条目数(所有属于该集合的元素,不管是否同时属于其他集合)。
  • 顶部单集合柱子(如单独的Action栏):显示仅属于该集合的条目数(元素仅在该集合中被标记,未出现在其他任何集合)。
  • 多集合交集柱子(如Action&Comedy):保持inclusive_intersection模式的逻辑,显示同时属于这些集合的条目数(不管是否在其他集合中)。

内容的提问来源于stack exchange,提问作者Panchito

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 23:45:54