我正在使用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个向量怎么样?必须有比将每个向量与所有其他向量进行比较更好的方法。理想情况下,我想要一些“共同矩阵中的特征”,对角线上有1个(每个向量具有与其自身共有的所有特征),并且在非对角线上具有不同向量之间共同的特征。类似的东西:
geneList1 geneList2
geneList1 1.0000000 0.5
geneList2 0.6666667 1.0
但对于多个载体。
答案 0 :(得分:1)
使用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]])
}
}
答案 1 :(得分:1)
最大的问题(我认为)是你的向量不是相同的长度,因此你不能把它们保持在任何其他形式而不是列表中。因此,第一步是使用mget
和ls
组合将它们从您的全局环境转换为列表对象,然后将它们与所有
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