Проверьте, находится ли значение в одном или нескольких диапазонах, и выведите все range_ID, содержащие это значение - PullRequest
1 голос
/ 20 сентября 2019

У меня есть фрейм данных (Genome_file) со всеми генами в геноме (Genome_file $ Gene), и для каждого гена у меня есть хромосома (Genome_file $ Chrom), на которой найден ген, и начальный (Genome_file $ Start)и конечные (Genome_file $ End) координаты в базовых парах.

Genome_file <- structure(list(Gene = c("Gene_1", "Gene_2", "Gene_3", 
"Gene_4", "Gene_5", "Gene_6", "Gene_7", "Gene_8", "Gene_9", "Gene_10"), 
Chrom = c("Chr_01", "Chr_01", "Chr_01", "Chr_01", "Chr_01", "Chr_04", 
"Chr_04", "Chr_04", "Chr_04", "Chr_04"), Start = c(1000L, 2000L, 3000L, 
4000L, 5000L, 1000L, 2000L, 3000L, 4000L, 5000L), End = c(1900L, 2900L, 
3900L, 4900L, 5900L, 1900L, 2900L, 3900L, 4900L, 5900L)), .Names = 
c("Gene", "Chrom", "Start", "End"), row.names = c(NA, -10L), class = 
"data.frame")

>Genome_file
Gene      Chrom   Start  End
Gene_1    Chr_01  1000   1900
Gene_2    Chr_01  2000   2900
Gene_3    Chr_01  3000   3900
Gene_4    Chr_01  4000   4900
Gene_5    Chr_01  5000   5900
Gene_6    Chr_04  1000   1900
Gene_7    Chr_04  2000   2900
Gene_8    Chr_04  3000   3900
Gene_9    Chr_04  4000   4900
Gene_10   Chr_04  5000   5900

В другом кадре данных (QTL) у меня есть список интервалов QTL, которые были найдены для этого генома в нескольких публикациях.Для каждого QTL фрейм данных сообщает ID (QTLs $ QTL_ID), начальную позицию интервала QTL (QTL $ Start), конечную позицию интервала QTL (QTL $ End) и хромосому, в которой обнаружен QTL(ЛКП $ Chrom).Некоторые QTL перекрываются друг с другом, поскольку они происходят из разных публикаций и были сопоставлены независимыми исследовательскими усилиями.

QTLs <- structure(list(QTL_ID = c("QTL_1", "QTL_2", "QTL_3", "QTL_4", 
"QTL_5"), Chrom = c("Chr_01", "Chr_01", "Chr_01", "Chr_03", "Chr_04"), 
Start = c(100L, 100L, 4000L, 7000L, 3000L), End = c(1950L, 3950L, 4950L, 
8000L, 4900L)), .Names = c("QTL_ID", "Chrom", "Start", "End"), row.names = 
c(NA, -5L), class = "data.frame")

> QTLs
QTL_ID  Chrom    Start  End
QTL_1   Chr_01   100    1950
QTL_2   Chr_01   100    3950
QTL_3   Chr_01   4000   4950
QTL_4   Chr_03   7000   8000
QTL_5   Chr_04   3000   4900

Теперь я хотел бы проверить, является ли начальная позиция каждого гена вфайл генома попадает в любой интервал QTL в кадре данных QTL.Всякий раз, когда ген попадает в QTL, я хотел бы напечатать QTL_ID в новом столбце Genome_file (назовем этот столбец «QTL»).В случае, если ген содержится в более чем одном интервале QTL, я хотел бы, чтобы все идентификаторы QTL, в которых содержится ген, были напечатаны в новом столбце «QTL», возможно, через точку с запятой (;).

Желаемый результат:

#Gene    Chrom    Start  End    QTL
#Gene_1  Chr_01   1000   1900   QTL_1;QTL_2
#Gene_2  Chr_01   2000   2900   QTL_2
#Gene_3  Chr_01   3000   3900   QTL_2
#Gene_4  Chr_01   4000   4900   QTL_3
#Gene_5  Chr_01   5000   5900            
#Gene_6  Chr_04   1000   1900            
#Gene_7  Chr_04   2000   2900            
#Gene_8  Chr_04   3000   3900   QTL_5
#Gene_9  Chr_04   4000   4900   QTL_5
#Gene_10 Chr_04   5000   5900            

До сих пор я был в состоянии применить следующую функцию, чтобы напечатать первый QTL, который, как обнаружено, содержит определенный ген.Тем не менее, я не могу понять, как напечатать все QTL, которые содержат определенный ген, разделенные точкой с запятой (;).

Функция, которую я пробовал:

library(magrittr)

# get a list of vectors where each item is whether a gene's start in 
Genome_file is comprised in a QTL in QTLs dataframe
Positionok  <- lapply(Genome_file$Gene_Start_bp, function(z) z >= 
QTLs$bp_Start_1LOD & z <= QTLs$bp_End_1LOD)

# another list of logical vectors indicating whether gene's chromosome 
matches the QTL chromosome
Chromok  <- lapply(Genome_file$Chrom, function(z) z== QTLs$Chrom)

# combine the two list and use the combined vectors as an index on 
Genome_file$QTL
Genome_file$QTL <- lapply(1:nrow(Genome_file), function(i) {
QTLs$QTL_ID[ Positionok[[i]] & Chromok[[i]]  ]
}) %>% 

# replace zero length strings with NA values
sapply(function(QTLs) ifelse(length(QTLs) == 0, NA, QTLs))

Любая помощь будетбыть очень ценным!Я застрял, и я не знаю, как продолжать свою работу!Спасибо всем заранее!

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