我最近一直在和R打交道,我遇到了一个有趣的问题。我必须绘制9个单列数据集的所有可能的维恩图(让我们将它们命名为df1 ... df9)。我正在使用库(gplots),venn
的代码片段带有示例输入:
venn(list(df1,df2,df3,df4))
问题是:如何生成这九个数据集的所有可能子集(总共有126个 - 计算过的使用过的梳子函数。),并将它们导出到列表中,这可以输入到venn中。例如: (DF1,DF2), (DF5,DF4), (DF3,DF5 DF8) 。 。 。 在这里,我将遍历所有选项并绘制每个选项的维恩图。 谢谢你的任何提示。
答案 0 :(得分:8)
让我们从一个可重复的例子开始:
# Sample data (9 15-element subsets of the letters stored in a list)
set.seed(144)
(dfs <- replicate(9, sample(letters, 15), simplify=FALSE))
# [[1]]
# [1] "b" "r" "y" "l" "g" "n" "a" "u" "z" "s" "j" "c" "h" "x" "m"
#
# [[2]]
# [1] "b" "n" "m" "t" "i" "f" "a" "l" "k" "u" "o" "c" "g" "v" "p"
# ...
venn
函数不支持超过5组的维恩图,而一组维恩图非常无趣。因此,我将限制为具有两到五组的子集:
# Get all subsets with 2-5 elements
subs <- do.call(expand.grid, replicate(length(dfs), c(F, T), simplify=F))
subs <- subs[rowSums(subs) %in% 2:5,]
venns <- apply(subs, 1, function(x) venn(dfs[x], show.plot=F))
venns
现在包含所有372个维恩图对象。例如,您可以使用plot(venns[[100]])
如果你真的想要绘制所有的维恩图,你可以做类似的事情:
apply(subs, 1, function(x) {
png(paste0("venn_", paste(which(x), collapse="_"), ".png"))
venn(dfs[x])
dev.off()
})
这将创建包含维恩图的372个图像文件,根据包含的集合命名。