我在矩阵中有一个基因的“命中列表”。每一行都是命中,格式为“染色体(字符)开始(数字)停止(数字)”。我想看看这些命中哪一个与基因组中的基因重叠,这是一个格式为“染色体起始基因”的基质
我有以下功能(打印dmelGenome第4列的基因列表):
geneListBuild <- function(dmelGenome='', hitList='', binSize='', saveGeneList='')
{
genomeColumns <- c('chr', 'start', 'stop', 'gene')
genome <- read.table(dmelGenome, header=FALSE, col.names = genomeColumns)
chr <- genome[,1]
startAdjust <- genome[,2] - binSize
stopAdjust <- genome[,3] + binSize
gene <- genome[,4]
genome <- data.frame(chr, startAdjust, stopAdjust, gene)
hits <- read.table(hitList, header=TRUE)
chrHits <- hits[hits$chr == "chr3R",]
chrGenome <- genome[genome$chr == "chr3R",]
genes <- c()
for(i in 1:length(chrHits[,1]))
{
for(j in 1:length(chrGenome[,1]))
{
if( chrHits[i,2] >= chrGenome[j,2] && chrHits[i,3] <= chrGenome[j,3] )
{
print(chrGenome[j,4])
}
}
}
genes <- unique(genes[is.finite(genes)])
print(genes)
fileConn<-file(saveGeneList)
write(genes, fileConn)
close(fileConn)
}
然而,当我用:
代替print()时genes[j] <- chrGenome[j,4]
R返回一个向量,该向量具有chrGenome [,1]中存在的某些值。我不知道它是如何选择这些值的,因为它们不在似乎满足if语句的行中。我认为这是一个索引问题?
此外,我确信有更有效的方法可以做到这一点。我是R的新手,所以我的代码效率不高。
这类似于“将嵌套循环的结果写入R中的另一个向量”,但我无法用该线程中的信息修复它。
感谢。
答案 0 :(得分:3)
我相信内循环可以替换为:
gene.in <- ifelse( chrHits[i,2] >= chrGenome[,2] & chrHits[i,3] <= chrGenome[,3],
TRUE, FALSE)
然后您可以使用该逻辑向量来选择您想要的内容。做
which(gene.in)
也可能对您有用。