Ответ 1
Я представил два решения, используя два разных пакета с возможностями диаграммы Venn. Как вы и ожидали, оба включают начальный шаг, используя функцию aggregate()
.
Я предпочитаю результаты из пакета venneuler
. По умолчанию эти метки не идеальны, но вы можете отрегулировать их, посмотрев на соответствующий метод plot
(возможно, используя locator()
для выбора координат).
Решение 1:
Одна из возможностей заключается в использовании venneuler()
в пакете venneuler
для рисования диаграммы Венна.
library(venneuler)
## Modify the "factor" column, by renaming it and converting
## it to a character vector.
levels(data$factor) <- c("a", "b", "c")
data$factor <- as.character(data$factor)
## FUN is an anonymous function that determines which letters are present
## 2 or more times in the cluster and then pastes them together into
## strings of a form that venneuler() expects.
##
inter <- aggregate(factor ~ cluster, data=data,
FUN = function(X) {
tab <- table(X)
names <- names(tab[tab>=2])
paste(sort(names), collapse="&")
})
## Count how many clusters contain each combination of letters
counts <- table(inter$factor)
counts <- counts[names(counts)!=""] # To remove groups with <2 of any letter
# a a&b a&b&c a&c b b&c c
# 19 13 12 14 13 9 12
## Convert to proportions for venneuler()
ps <- counts/sum(counts)
## Calculate the Venn diagram
vd <- venneuler(c(a=ps[["a"]], b = ps[["b"]], c = ps[["c"]],
"a&b" = ps[["a&b"]],
"a&c" = ps[["a&c"]],
"b&c" = ps[["b&c"]],
"a&b&c" = ps[["a&b&c"]]))
## Plot it!
plot(vd)
Несколько заметок о вариантах, которые я сделал при написании этого кода:
-
Я изменил имена факторов от
"factor-a"
до"a"
. Вы можете, очевидно, изменить это. -
Мне нужно, чтобы каждый фактор присутствовал >= 2 раза (вместо > 10), чтобы подсчитываться в каждом кластере. (Это должно было продемонстрировать код с этим небольшим подмножеством ваших данных.)
-
Если вы посмотрите на промежуточный объект
counts
, вы увидите, что он содержит исходный неназванный элемент. Этот элемент представляет собой число кластеров, содержащих менее 2 букв. Вы можете решить, лучше ли я, хотите ли вы включить их в вычисление последующего объектаps
( "пропорции" ).
Решение второго:
Другая возможность заключается в использовании vennCounts()
и vennDiagram()
в пакете Bioconductor limma
. Чтобы загрузить пакет, следуйте инструкциям здесь. В отличие от вышеприведенного решения venneuler
, перекрытие в полученной диаграмме не пропорционально фактической степени пересечения. Вместо этого он аннотирует диаграмму с фактическими частотами. (Обратите внимание, что это решение не содержит никаких изменений в столбце data$factor
.)
library(limma)
out <- aggregate(factor ~ cluster, data=data, FUN=table)
out <- cbind(out[1], data.frame(out[2][[1]]))
counts <- vennCounts(out[, -1] >= 2)
vennDiagram(counts, names = c("Factor A", "Factor B", "Factor C"),
cex = 1, counts.col = "red")