Вы можете использовать библиотеку venn
(особенно подходит для ситуаций, когда у вас нет NA в ваших данных):
venn_table <- venn(as.list(dat))
BLUE RED GREEN counts
0 0 0 0
GREEN 0 0 1 3
RED 0 1 0 2
RED:GREEN 0 1 1 1
BLUE 1 0 0 2
BLUE:GREEN 1 0 1 1
BLUE:RED 1 1 0 2
BLUE:RED:GREEN 1 1 1 1
И:
attr(venn_table, "intersections")
$GREEN
[1] 8 10 11
$RED
[1] 7 13
$`RED:GREEN`
[1] 9
$BLUE
[1] 1 NA
$`BLUE:GREEN`
[1] 4
$`BLUE:RED`
[1] 2 3
$`BLUE:RED:GREEN`
[1] 6
Включить такжеидентификаторы:
data.frame(venn_table[2:nrow(venn_table), ],
ID = do.call("rbind", lapply(attr(venn_table, "intersections"), paste0, collapse = ",")))
BLUE RED GREEN counts ID
GREEN 0 0 1 3 8,10,11
RED 0 1 0 2 7,13
RED:GREEN 0 1 1 1 9
BLUE 1 0 0 2 1,NA
BLUE:GREEN 1 0 1 1 4
BLUE:RED 1 1 0 2 2,3
BLUE:RED:GREEN 1 1 1 1 6
Один из способов иметь дело с NA:
venn_table2 <- data.frame(venn_table[2:nrow(venn_table), length(venn_table), drop = FALSE],
ID = do.call("rbind", lapply(attr(venn_table, "intersections"), paste0, collapse = ",")))
counts <- venn_table2[1] - with(venn_table2, lengths(regmatches(ID, gregexpr("NA", ID))))
counts
GREEN 3
RED 2
RED:GREEN 1
BLUE 1
BLUE:GREEN 1
BLUE:RED 2
BLUE:RED:GREEN 1
И более элегантный способ иметь дело с NA (основано на комментарии @M-):
print(venn(Map(function(x) x[!is.na(x)], as.list(dat))))
BLUE RED GREEN counts
0 0 0 0
GREEN 0 0 1 3
RED 0 1 0 2
RED:GREEN 0 1 1 1
BLUE 1 0 0 1
BLUE:GREEN 1 0 1 1
BLUE:RED 1 1 0 2
BLUE:RED:GREEN 1 1 1 1