Объединение по диапазону в R – Применение циклов

Я разместил здесь вопрос: Согласованный диапазон Слияние в R о слиянии двух файлов на основе числа в одном файле, попадающего в диапазон во втором файле. До сих пор мне не удалось собрать код для выполнения этого. Проблема, с которой я сталкиваюсь, заключается в том, что код, который я использую, сравнивает файлы по строкам. Это проблема, потому что 1.) Один файл намного длиннее, чем другой файл, и 2.) Мне нужны строки в более коротком файле для сканирования через каждую пару диапазона в более длинном файле – не только диапазон в той же строке ,

Я работал с функциями, опубликованными в исходном вопросе, и я чувствую, что должен быть способ применить его к более общему циклу, который сравнивает каждую строку в первом файле с каждой строкой во втором файле, но я не знаю, Это еще не выяснено. Если у кого-нибудь есть предложения, я был бы признателен.

**** EDITED.

Характер данных таков: каждый диапазон не обязательно уникален, хотя большинство из них. Они также не равны по размеру, а некоторые полностью попадают в другие. findInterval создает ошибку, потому что диапазоны не могут быть отсортированы для того, чтобы попасть в «нераспадающий» порядок.

Вот первые 6 строк каждого кадра данных:

 file1test <- data.frame(SNP=c("rs2343", "rs211", "rs754", "rs854", "rs343", "rs626"), BP=c(860269, 369640, 861822, 367934, 706940, 717244)) file2 <- data.frame(Gene=c("E613", "E92", "E49", "E3543", "E11", "E233"), BP_start=c(367640, 621059, 721320, 860260, 861322, 879584), BP_end = c(368634, 622053, 722513, 879955, 879533, 894689)) 

Итак, как вы можете видеть, диапазон на 5-й строке находится в пределах диапазона на 4-й строке, а два SNP из первого файла попадают в диапазон на 4-й строке, но только один входит в диапазон на второй строке.

Первый файл, содержащий SNP, имеет только ~ 400 строк. Однако второй файл, содержащий диапазоны, имеет около 20K. То, что я хотел бы представить как выход, – это кадр данных, содержащий строки из первого файла (SNP) с BP, которые попадают в диапазон BP во втором файле. Если SNP попадает в два диапазона, то он появляется дважды и т. Д.

Пакет GenomicRanges в Bioconductor предназначен для такого типа операций. Прочтите данные, например, read.delim, чтобы

 con <- textConnection("SNP BP rs064 12292 rs319 345367 rs285 700042") snps <- read.delim(con, head=TRUE, sep="") con <- textConnection("Gene BP_start BP_end E613 345344 363401 E92 694501 705408 E49 362370 368340") ## missing trailing digit on BP_end?? genes <- read.delim(con, head=TRUE, sep="") 

затем создайте «IRanges» из каждого

 library(IRanges) isnps <- with(snps, IRanges(BP, width=1, names=SNP)) igenes <- with(genes, IRanges(BP_start, BP_end, names=Gene) 

(обратите внимание на системы координат, IRanges ожидает, что начало и конец будут включены в диапазон, а также end> ​​= start ожидать для диапазонов 0-ширины, когда end = start - 1). Затем найдите SNP («запрос» в терминологии IRanges), которые перекрывают гены («субъект»)

 olaps <- findOverlaps(isnps, igenes) 

два из SNP перекрываются

 > queryHits(olaps) [1] 2 3 

и они перекрывают первый и второй гены

 > subjectHits(olaps) [1] 1 2 

Если запрос перекрывал несколько генов, он бы повторялся в queryHits (и наоборот). Затем вы можете объединить свои кадры данных как

 > cbind(snps[queryHits(olaps),], genes[subjectHits(olaps),]) SNP BP Gene BP_start BP_end 2 rs319 345367 E613 345344 363401 3 rs285 700042 E92 694501 705408 

Обычно гены и SNP имеют хромосому и цепочку ('+', '-' или '*', чтобы указать, что нить не важна), и вы хотите сделать перекрытия в контексте этих; вместо создания экземпляров «IRanges» вы создали бы «GRanges» (геномные диапазоны), и последующее бухгалтерское обслуживание будет заботиться о вас

 library(GenomicRanges) isnps <- with(snps, GRanges("chrA", IRanges(BP, width=1, names=SNP), "*") igenes <- with(genes, GRanges("chrA", IRanges(BP_start, BP_end, names=Gene), "+")) 

Я считаю, что то, о чем вы просите, является conditional join . Они легки в SQL, и пакет sqldf позволяет легко запрашивать кадры данных в R, используя SQL.

Просто выберите версию в зависимости от того, как вы хотите, чтобы не сравнимые SNP обрабатывались.

Версия внутреннего присоединения:

 > sqldf("select * from file1test f1 inner join file2 f2 + on (f1.BP > f2.BP_start and f1.BP<= f2.BP_end) ") 

Вывод:

  SNP BP Gene BP_start BP_end 1 rs2343 860269 E3543 860260 879955 2 rs754 861822 E3543 860260 879955 3 rs754 861822 E11 861322 879533 4 rs854 367934 E613 367640 368634 > 

Левая версия для входа:

 > sqldf("select * from file1test f1 left join file2 f2 + on (f1.BP > f2.BP_start and f1.BP<= f2.BP_end) ") 

Вывод:

  SNP BP Gene BP_start BP_end 1 rs2343 860269 E3543 860260 879955 2 rs211 369640  NA NA 3 rs754 861822 E3543 860260 879955 4 rs754 861822 E11 861322 879533 5 rs854 367934 E613 367640 368634 6 rs343 706940  NA NA 7 rs626 717244  NA NA > 

Обратите внимание, что вы можете быть осторожны, когда вы ставите = если важно, какая группа BP будет входить в случае, когда BP точно соответствует BP_start или BP_end.

  • Усовершенствованный цикл «for» вызывает исключение ArrayIndexOutOfBoundsException
  • Как выйти из цикла while в java со сканирующим методом «hasNext» как условие?
  • Создание треугольника с петлями
  • Фоновый цикл Python при запуске других команд
  • Почему я должен использовать foreach вместо for (int i = 0; i <length; i ++) в циклах?
  • Как сделать дерево в Twig
  • Следует ли избегать использования выражений Java Label?
  • Для петли для разбиения матрицы на подматрицы равного размера
  • JavaScript: разница между .forEach () и .map ()
  • Как сгенерировать разные случайные числа в цикле в C ++?
  • Почему memcpy () и memmove () быстрее, чем указатели?
  • Давайте будем гением компьютера.