在 R 中使用向量的常见字符特征矩阵

Matrix of common character features using vectors in R

我用的是R语言

我有大约 9 个向量,每个向量都是一个包含 4 到 3900 个基因名称的字符向量。我基本上想看看这些载体有多少共同基因。例如,

geneList1=c("gene1","gene2","gene6","gene28")
geneList2=c("gene2","gene4","gene1")

通过使用 %in% 运算符,我可以检查两个向量有多少共同特征:

geneList2 %in% geneList1
## [1]  TRUE FALSE  TRUE

因为我有比较大的向量,理想情况下我想看看共同基因的比例,即

mean(geneList2 %in% geneList1)
## [1] 0.6666667

因此,两个向量相对容易,但是9个向量呢?必须有比将每个向量与所有其他向量进行比较更好的方法。理想情况下,我想要一些 'features in common matrix',对角线为 1(每个向量都具有与其自身相同的所有特征),而在非对角线上则为不同向量之间的共同特征。类似于:

          geneList1 geneList2
geneList1 1.0000000       0.5
geneList2 0.6666667       1.0

但对于多个向量。

apply 函数可能有许多更快的方法,但老派的嵌套 for 循环也能达到目的。

首先列出所有单独的 genList,然后循环两次。

genList1 <- as.character(sample(x = 1:10, size=1))
genList2 <- as.character(sample(x = 1:10, size=2))
genList3 <- as.character(sample(x = 1:10, size=3))
genList4 <- as.character(sample(x = 1:10, size=4))
genList5 <- as.character(sample(x = 1:10, size=10))
genList6 <- as.character(sample(x = 1:10, size=6))
genList7 <- as.character(sample(x = 1:10, size=7))
genList8 <- as.character(sample(x = 1:10, size=8))
genList9 <- as.character(sample(x = 1:10, size=1))

genlist <- list(genList1,geneList2,genList3,genList4,genList5,genList6,genList7,
                                    genList8,genList9)

N <- length(genelist)

commom_matrix <- matrix(0, ncol=N, nrow=N)
for(i in 1:length(genelist)){
    for(j in 1:length(genlist)){
         commom_matrix[i,j] <- mean(genlist[[i]] %in% genlist[[j]])
    }
}

最大的问题(如我所见)是你的向量不是来自相同的长度,因此你不能将它们保存在任何其他形式而不是列表中。因此,第一步是使用 mgetls 组合将它们从全局环境中获取到列表对象中,然后将每个与所有

进行比较
l <- mget(ls(pattern = "geneList\d+"))
sapply(l, function(x) lapply(l, function(y) mean(y %in% x)))
#           geneList1 geneList2
# geneList1 1         0.5      
# geneList2 0.6666667 1