基于指定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
相关产品推荐
相关产品推荐

