R: создать вектор из вложенного цикла for

#r #vector #for-loop #nested

#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]  amp;amp;  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. Это большой кусок кода, который мы не можем воспроизвести (нет образцов данных), поэтому ответить на него будет действительно сложно. Пожалуйста, не могли бы вы (1) предоставить данные и (2) попытаться более точно определить источник проблемы.

2. Это очень, очень похоже (заставляя меня задуматься, является ли user #### перекрестным) на вопрос, который определенно был перекрестно размещен в r-help и списках BioC. В BioConductor есть хорошая поддержка таких действий: stat.ethz.ch/pipermail/bioconductor/2011-October/041776.html

Ответ №1:

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

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

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

 which(gene.in)
  

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

Комментарии:

1. Или даже gene.in <- chrHits[i,2] >= chrGenome[,2] amp; chrHits[i,3] <= chrGenome[,3] .

2. Спасибо — я попробовал модификацию предложения Патрика, сделанную Ричи, но она вернула только одно значение, и я знаю, что есть более одного попадания, поскольку я вижу их, когда использую print() . Сейчас у меня мало времени, и я просто копирую распечатанный список в текстовый файл. Я не занимаюсь перекрестным размещением, но спасибо, что указали мне на поток bioconductor! Я проверю это. Ричи — проблема возникает, если я удаляю «print (chrGenome[j,4])» и пытаюсь отправить вывод объекту. Я считаю, что я неправильно индексирую.