如何在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
相关产品推荐
相关产品推荐

