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

基于指定R数据框计算布尔列重叠数并绘制韦恩图的方法

解决方案:计算列间重叠并绘制韦恩图

首先,先确认你的数据框内容,咱们先把数据加载好:

df <- structure(list(rowid = 1:12, 
                     P = c(TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, TRUE, FALSE, TRUE, TRUE), 
                     T = c(TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, TRUE, TRUE, TRUE), 
                     X = c(TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, TRUE, FALSE, TRUE, TRUE)), 
                row.names = c(NA, -12L), class = c("tbl_df", "tbl", "data.frame"))

1. 计算两两列的重叠与对应列的TRUE总数

根据你给出的期望格式,我们需要计算每对列的交集数量(两列均为TRUE的行数),以及第一列的TRUE总数。用dplyr和purrr可以高效完成这个任务:

# 加载所需工具包
library(dplyr)
library(purrr)

# 定义需要比较的列对组合
compare_pairs <- list(
  c("P", "T"),
  c("P", "X"),
  c("T", "X"),
  c("T", "P")
)

# 批量计算每对的重叠数和对应列的TRUE总数
overlap_result <- map_dfr(compare_pairs, function(pair) {
  col1 <- pair[1]
  col2 <- pair[2]
  # 统计两列同时为TRUE的行数
  overlap_count <- sum(df[[col1]] & df[[col2]])
  # 统计第一列的TRUE总数
  total_count <- sum(df[[col1]])
  # 组装结果行
  tibble(
    comparison = paste0(col1, "_vs_", col2),
    overlap = overlap_count,
    total = total_count
  )
})

# 查看最终结果
overlap_result

运行后会得到和你期望完全匹配的输出:

# A tibble: 4 × 3
  comparison overlap total
  <chr>        <int> <int>
1 P_vs_T           9    10
2 P_vs_X          10    10
3 T_vs_X           9    11
4 T_vs_P           9    11

2. 绘制韦恩图

推荐用ggvenn包绘制,它的语法贴近ggplot2,操作简单且输出美观:

# 先安装包(如果还没装的话)
# install.packages("ggvenn")
library(ggvenn)

# 绘制三元韦恩图,只取P、T、X三列数据
ggvenn(
  df[, c("P", "T", "X")],
  fill_color = c("#0073C2FF", "#EFC000FF", "#868686FF"), # 自定义填充色
  stroke_size = 0.5, # 调整边框粗细
  set_name_size = 4, # 集合名称字体大小
  text_size = 3 # 内部数字字体大小
)

如果你习惯用基础工具,也可以用VennDiagram包:

# 安装包(未安装时执行)
# install.packages("VennDiagram")
library(VennDiagram)

# 生成韦恩图并导出到当前目录的venn.png文件
venn.diagram(
  x = list(
    P = which(df$P), # 记录P列TRUE的行号
    T = which(df$T),
    X = which(df$X)
  ),
  filename = "venn.png",
  fill = c("blue", "gold", "gray"),
  alpha = 0.5, # 填充透明度
  main = "Venn Diagram of P, T, X",
  main.cex = 1.2,
  cat.cex = 1 # 类别名称字体大小
)

这样就能直观展示三列的交集分布情况了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:50:58