如何从 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
我有多个基因列表,例如:
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