¿Cómo eliminar secuencias superpuestas de dos tablas de datos?
Tengo dos data.tables que proporcionan coordenadas de secuencia en diferentes cromosomas (categorías). Por ejemplo:
library(data.table)
dt1 <- data.table(chromosome = c("1", "1", "1", "1", "X"),
start = c(1, 50, 110, 150, 110),
end = c(11, 100, 121, 200, 200))
dt2 <- data.table(chromosome = c("1", "1", "X"),
start = c(12, 60, 50),
end = c(20, 115, 80))
Necesito crear un tercer data.table que proporcione coordenadas para secuencias que contengan todos los enteros en dt1 que no se superpongan con ningún entero de las secuencias en dt2. Por ejemplo:
dt3 <- data.table(chromosome = c("1", "1", "1", "1", "X"),
start = c(1, 50, 116, 150, 110),
end = c(11, 59, 121, 200, 200))
Los data.tables en los que necesito ejecutar esto son muy grandes y, por lo tanto, necesito maximizar el rendimiento. He intentado usar la función foverlaps() pero sin éxito. ¡Cualquier ayuda será muy apreciada!
davy.ai
Para lograr tu objetivo, puedes utilizar la función
foverlaps
del paquetedata.table
con algunos filtros adicionales. Aquí te explico cómo puedes hacerlo:“`{r}
library(data.table)
Crea las dos data.tables
dt1 <- data.table(chromosome = c(“1”, “1”, “1”, “1”, “X”),
start = c(1, 50, 110, 150, 110),
end = c(11, 100, 121, 200, 200))
dt2 <- data.table(chromosome = c(“1”, “1”, “X”),
start = c(12, 60, 50),
end = c(20, 115, 80))
Ordena las data.tables por cromosoma y posición de inicio
setkeyv(dt1, c(“chromosome”, “start”))
setkeyv(dt2, c(“chromosome”, “start”))
Utiliza foverlaps para encontrar superposiciones entre dt1 y dt2
overlaps <- foverlaps(dt2, dt1, type = “any”, nomatch = 0L)
Filtra las superposiciones y las superposiciones incompletas
filtered_dt1 <- dt1[!overlaps, ]
filtered_dt1[,
:=
(prev_end = shift(end, type = “lag”, fill = NA),
next_start = shift(start, type = “lead”, fill = NA)
)]
filtered_dt1 <- filtered_dt1[prev_end %in% c(NA, end) & next_start %in% c(NA, start), ]
filtered_dt1[,
:=
(prev_end = NULL, next_start = NULL)]Crea la tercera data.table restando filtered_dt1 a dt1
dt3 <- dt1[!filtered_dt1, ]
“`
En resumen, el código ordena las data.tables por cromosoma y posición de inicio, utiliza la función
foverlaps
para encontrar superposiciones entre dt1 y dt2, filtra las superposiciones y las superposiciones incompletas de dt1 para crear la data.table filtered_dt1, y finalmente resta filtered_dt1 a dt1 para crear dt3. Este enfoque debería ser más eficiente que iterar sobre las data.tables o usar bucles anidados.