R: создать вектор из вложенного цикла for - PullRequest
1 голос
/ 25 октября 2011

У меня есть «список совпадений» генов в матрице.Каждая строка является хитом, и форматом является «хромосома (символ) начало (число) остановка (число)».Хотелось бы посмотреть, какие из этих совпадений перекрываются с генами в геноме мухи, который представляет собой матрицу с форматом «старт-стоп хромосомы»

У меня работает следующая функция (выводит список генов изстолбец 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) 

}

однако, когда я заменяю print () на:

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

R возвращает вектор, который имеет некоторые значения, присутствующие в chrGenome [, 1].Я не знаю, как он выбирает эти значения, потому что они не находятся в строках, которые, кажется, выполняют оператор if.Я думаю, что это проблема индексации?

Также я уверен, что есть более эффективный способ сделать это.Я новичок в R, поэтому мой код не очень эффективен.

Это похоже на «запись результатов из вложенного цикла в другой вектор в R», но я не мог исправить это с помощьюинформация в этой теме.

Спасибо.

1 Ответ

3 голосов
/ 25 октября 2011

Я считаю, что внутренний цикл можно заменить на:

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

Затем вы можете использовать этот логический вектор, чтобы выбрать то, что вы хотите.Выполнение

which(gene.in)

также может быть полезным для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...