es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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!

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para lograr tu objetivo, puedes utilizar la función foverlaps del paquete data.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.

Comments are closed.