#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])» и пытаюсь отправить вывод объекту. Я считаю, что я неправильно индексирую.