2015-04-20 4 views
3

Недавно я имел дело с R, и у меня возникла интересная проблема. Мне нужно построить все возможные диаграммы venn из 9 наборов данных с одним столбцом (назовем их df1 ... df9). Я использую библиотеку (gplots), а часть кода для venn с примером ввода является:Построение всех подгрупп - диаграмма venn

venn(list(df1,df2,df3,df4)) 

Вопрос: как я могу генерировать все возможные подмножества этих девяти наборов данных (имеется в общей сложности 126 - вычисленная функция используемых гребней.) и экспортировать их в список, который может быть введен в venn. Так, например: (df1, df2), (df5, df4), (df3, df5, df8) . . . Здесь я бы перебрал все варианты и построил диаграмму venn для каждого. Спасибо за любые подсказки.

+0

Вы понимаете, что дадут вам 512 диаграмм Венна, не так ли? Вы уверены, что это то, что вы хотите? Кроме того, я не знаю никакой реализации, которая поддерживает более 5 наборов. Я помню, как я ответил на соответствующий вопрос [здесь] (http://stackoverflow.com/questions/23559371/how-to-get-the-list-of-items-in-venn-diagram-in-r/23560500#23560500) , –

+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]])

enter image description here

Если вы действительно хотите, чтобы построить все диаграммы Венна, вы могли бы сделать что-то вроде:

apply(subs, 1, function(x) { 
    png(paste0("venn_", paste(which(x), collapse="_"), ".png")) 
    venn(dfs[x]) 
    dev.off() 
}) 

Это создало бы 372 изображения файлы, содержащие диаграммы venn, именованные в соответствии с наборами, которые включены.

+0

Это здорово, конечно, мне не нужны все они, но зная, как это сделать, это ключ, это потрясающе! –