2011-10-25 42 views
1

我有一个矩阵中的“命中列表”的基因。每一行都是命中,格式是“染色体(字符)开始(一个数字)停止(一个数字)”。我想看看哪些命中与苍蝇基因组中的基因重叠,这是一个格式为“染色体起始停止基因”的矩阵R:从嵌套for循环创建矢量

我有以下功能可用(打印列4中的基因列表dmelGenome的):

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) 

} 

然而,当我替换打印()其中:

genes[j] <- chrGenome[j,4] 

ř返回具有某些值存在于chrGenome载体[1]。我不知道它是如何选择这些值的,因为它们不在行,似乎符合if语句。我认为这是一个索引问题?

此外,我相信有一个更有效的方法来做到这一点。我是R新手,所以我的代码效率不高。

这与“将结果从嵌套循环写入R中的另一个向量”类似,但我无法用该线程中的信息修复它。

谢谢。

+0

这是我们无法复制的大部分代码(没有示例数据),所以它的确很难回答。请您能(1)提供数据和(2)尝试并更准确地找出问题的根源。 –

+0

这是非常非常相似的(使我怀疑用户####是否在交叉打印)到一个肯定与r-help和BioC列表交叉的问题。 BioConductor对此类活动提供了很好的支持:https://stat.ethz.ch/pipermail/bioconductor/2011-October/041776.html –

回答

3

相信内环可以替换为:

gene.in <- ifelse(chrHits[i,2] >= chrGenome[,2] & chrHits[i,3] <= chrGenome[,3], 
    TRUE, FALSE) 

然后你可以使用该逻辑向量来选择你想要的东西。这样做

which(gene.in) 

也可能是对你有用的。

+0

甚至是'gene.in < - chrHits [i,2]> = chrGenome [ ,2]&chrHits [i,3] <= chrGenome [,3]'。 –

+0

Duh。谢谢里奇 –

+0

谢谢 - 我尝试了里奇对帕特里克建议的修改,但它只返回了一个值,并且我知道在使用print()时我可以看到它们,因此有多个命中。我现在正忙着准备时间,并且只是将打印的列表复制到一个txt文件中。我不是交叉邮寄,但感谢您将我指向bioconductor线程!我会检查出来的。里奇 - 如果我删除“print(chrGenome [j,4])”并尝试将输出发送到对象,则会出现问题。我相信我的索引不正确。 – user1012822