A colleague asked me this question: "I'm trying to find a way to find genes that overlap between three datasets. I have used intersect for two dataframes but can't seem to find a solution for three dataframes on google. Do you know any snazzy way of doing that?" I thought using the venn() function from the gplots package is a pretty snazzy solution, so that's what I recommended.
The venn() function is used to plot a Venn diagrams for up to 5 sets but you can use it to list intersections.
# install if necessary
install.packages('gplots')
library(gplots)
a <- 1:10
b <- 3:12
c <- 5:14
d <- 7:16
e <- 9:18
my_list <- list(a, b, c, d, e)
venn(my_list)
# save object from venn
my_venn <- venn(my_list, show.plot = FALSE)
class(my_venn)
[1] "venn"
# which object class?
library(pryr)
otype(my_venn)
[1] "S3"
# what are the attributes names?
names(attributes(my_venn))
[1] "dim" "dimnames" "intersections" "class"
# use attr() to get intersections
attr(x = my_venn, "intersections")
$A
[1] "1" "2"
$E
[1] "17" "18"
$`A:B`
[1] "3" "4"
$`D:E`
[1] "15" "16"
$`A:B:C`
[1] "5" "6"
$`C:D:E`
[1] "13" "14"
$`A:B:C:D`
[1] "7" "8"
$`B:C:D:E`
[1] "11" "12"
$`A:B:C:D:E`
[1] "9" "10"
# get specific intersections
attr(x = my_venn, "intersections")$`A:B`
[1] "3" "4"
A bit hard to visualise the intersections when there are five lists.
Notice that attr(x = my_venn, "intersections")$A:B gives you only 3 and 4 and not 3, 4, 5, 6, 7, 8, 9, and 10? This is because 3 and 4 are the only intersections that are unique to A and B, when taking the other intersections into account.
intersect(a, b) [1] 3 4 5 6 7 8 9 10 # an element in the union of C, D, and E may or may not intersect A and B # however, if they do intersect any element in A and B, then that element is not # unique to intersect(a, b) setdiff(intersect(a, b), union(union(c, d), e)) [1] 3 4 # and finally the non-snazzy way of intersecting three lists intersect(a, intersect(b,c)) [1] 5 6 7 8 9 10

This work is licensed under a Creative Commons
Attribution 4.0 International License.
Hi Dave,
yesterday a new preprint exactly for this task plus plotting came out:
http://biorxiv.org/content/early/2017/02/18/109728
Might be of interest.
Cheers,
Andreas
Hi Andreas,
thanks for that. The plots look great and it even comes as a Shiny app!
Cheers,
Dave
I think you can use jvenn, it’s very simple and useful!
http://bioinfo.genotoul.fr/jvenn
Thanks, it does look like a nice tool.