如何从 R 中的多个 lists/vectors 重叠 table?

How to make a overlap table from multiple lists/vectors in R?

我有多个基因列表,例如:

listA <- c("geneA", "geneB", "geneC")

listB <- c("geneA", "geneB", "geneD", "geneE")

listC <- c("geneB", "geneF")

...

我想要一个 table 来显示列表之间重叠元素的数量,例如:

       listA   listB  listC  ...
listA   3       2      1
listB   2       4      1
listC   1       1      2
...

我知道如何获得每对之间的重叠数量,例如 length(intersect(listA, listB))。但是生成重叠的更简单方法是什么 table?

这是base R

中的一个方法
crossprod(table(stack(mget(ls(pattern = "^list")))))
#       ind
#ind     listA listB listC
#  listA     3     2     1
#  listB     2     4     1
#  listC     1     1     2

mget(ls(pattern = "^list")) 将为您提供全局环境中名称以 "list".

开头的元素列表

stack会把这个列表变成下面的数据框

stack(mget(ls(pattern = "^list")))
#  values   ind
#1  geneA listA
#2  geneB listA
#3  geneC listA
#4  geneA listB
#5  geneB listB
#6  geneD listB
#7  geneE listB
#8  geneB listC
#9  geneF listC

呼叫 table returns.

out <- table(stack(mget(ls(pattern = "^list"))))
out
#       ind
#values  listA listB listC
#  geneA     1     1     0
#  geneB     1     1     1
#  geneC     1     0     0
#  geneD     0     1     0
#  geneE     0     1     0
#  geneF     0     0     1

crossprod 然后计算

t(out) %*% out

哪个returns

#       ind
#ind     listA listB listC
#  listA     3     2     1
#  listB     2     4     1
#  listC     1     1     2

创建所有对象的列表

list.all <- list(listA, listB, listC)

使用outer

outer(list.all, list.all, Vectorize(function(x, y) sum(x %in% y)))

#      [,1] [,2] [,3]
# [1,]    3    2    1
# [2,]    2    4    1
# [3,]    1    1    2

或使用sapply

sapply(list.all, function(x) sapply(list.all, function(y) sum(y %in% x)))

#      [,1] [,2] [,3]
# [1,]    3    2    1
# [2,]    2    4    1
# [3,]    1    1    2