У меня есть 2 таблицы. Они оба находятся в форме хромосомы, начальные и конечные координаты на этой хромосоме. Первая таблица содержит гены, а вторая таблица содержит короткие последовательности, которые могут или не могут попадать в эти гены. В моем реальном наборе данных гены составляют около 50 000 строк, а последовательности - около 7.000.000 строк, а обе таблицы имеют дополнительные столбцы. Я хотел бы найти перекрытия между двумя таблицами.Повышение эффективности таблицы пересекается
chromosome=as.character(rep(c(1,2,3,4,5), each=10000))
start=floor(runif(50000, min=0, max=50000000))
end=start+floor(runif(10000, min=0, max=10000))
genes=cbind(chromosome, start, end)
startseq=floor(runif(7000000, min=0, max=50000000))
endseq=startseq+4
sequences=cbind(chromosome, startseq, endseq)
Я пытаюсь найти все пересекается с помощью:
for (g in 1:nrow(sequences)) {
seqrow=as.vector(sequences[g,])
rownr=which(genes[,1]==seqrow[1] & genes[,2] < seqrow[2] & genes[,3] > seqrow[3])
print(rownr)
}
я намерен использовать эти номера строк для выполнения действий дополнительных столбцов есть в моих реальных данных. На данный момент проблема заключается в том, что описанный процесс довольно медленный. Каким образом я мог бы ускорить это пересечение?
Похоже, что код @ emilliman5 решает вашу проблему, но я все еще хочу прокомментировать одну вещь. Когда вы создаете эти таблицы, «гены» и «последовательности», вы используете функцию «cbind». И так как все входы представляют собой атомные векторы, а один из них является символьным вектором ('chromosome'), он создает матрицу символов. Тип 'head (chromosome)' - все числа фактически стали строками - и я думаю, что это не подходящая вещь, когда вы хотите сравнить числа позже. В таких случаях вам нужно создать здесь 'data.frame' вместо' matrix': 'data.frame (sequence, start, end)'. –
Вы абсолютно правы, спасибо, что упомянули об этом. – Xizam