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

如何在R中编写函数快速生成多变量复杂Euler图(欧拉图)

实现方案

以下是直接可用的封装函数,无需手动编写任何组合枚举逻辑:

library(eulerr)

generate_euler_input <- function(df, target_cols, positive_val = 1) {
  # 初始化统计结果向量
  euler_stats <- c()
  # 遍历从1到全变量的所有子集大小
  for (k in 1:length(target_cols)) {
    # 生成当前大小的所有列组合
    comb_list <- combn(target_cols, k, simplify = FALSE)
    # 逐组合计算符合条件的行数
    for (comb in comb_list) {
      # 生成eulerr要求的&连接格式的键名
      comb_name <- paste(comb, collapse = "&")
      # 多列条件判断:所有指定列取值为阳性值,自动忽略NA
      condition <- Reduce(`&`, lapply(comb, function(col) df[[col]] == positive_val))
      comb_count <- sum(condition, na.rm = TRUE)
      # 写入结果向量
      euler_stats[comb_name] <- comb_count
    }
  }
  return(euler_stats)
}

使用方法

只需传入数据集和参与绘图的列名即可完成全部预处理,你原来的6变量场景使用示例如下:

# 你的示例数据集
dataset <- data.frame(
  A = rep(c(1, 2, NA), length.out = 100),
  B = rep(c(2, NA, 1), length.out = 100),
  C = rep(c(NA, 1, 2), length.out = 100),
  D = rep(c(NA, 2, 1), length.out = 100),
  E = rep(c(1, NA, 2), length.out = 100),
  F = rep(c(1, 2, NA), length.out = 100)
)

# 一行代码生成euler输入向量
euler_primary <- generate_euler_input(dataset, target_cols = c("A", "B", "C", "D", "E", "F"))

# 绘图逻辑和原有逻辑完全一致
venn_primary <- euler(euler_primary)
plot(venn_primary,
     quantities = list(cex = .75),
     fill = c("red", "blue", "green", "violet", "orange", "brown"),
     lty = 1,
     cex = 0.5,
     labels = NULL,
     legend = list(labels = letters[1:6]))

如果需要生成11变量的Euler图,仅需要将target_cols参数替换为你11个目标列的名称向量即可,无需修改其他代码。

额外说明

  • 函数默认统计取值为1的行作为阳性样本,如果你的判断阈值不同,可以修改positive_val参数自定义
  • 自动规避手动编写代码的拼写错误(你原有手动代码中存在A&D、A&E等统计项误用C列的问题,自动生成逻辑不会出现这类错误)

注:11个变量的Euler图拟合复杂度极高,eulerr包可能无法生成完全贴合真实交集的可视化结果,你可以根据函数返回的拟合优度指标调整参数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 10:48:03