У меня есть фрейм данных (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))
Любая помощь будетбыть очень ценным!Я застрял, и я не знаю, как продолжать свою работу!Спасибо всем заранее!