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.

Convertir las coordenadas de intervalos divididos a coordenadas de intervalos continuos.

Tengo un data.frame en el cual cada id se mapea a varios intervalos lineales no contiguos, que no se superponen y están ordenados en orden ascendente:

df <- data.frame(id = c(rep("id1",3),rep("id2",4)),
                 start = c(101,220,307,550,658,742,855),
                 end = c(154,246,326,625,712,811,944),
                 stringsAsFactors = F)

Me gustaría agregar nuevas columnas de start y end que sumen acumulativamente las longitudes de los intervalos y muestren las coordenadas de inicio y fin acumulativas.

Entonces, para el ejemplo df anterior, estas nuevas columnas de start y end (cum.start, cum.end) serán:

df$cum.start <- c(1,55,82,1,77,132,202)
df$cum.end <- c(54,81,101,76,131,201,291)

¿Hay alguna forma de hacer esto usando dplyr?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Sí, hay una solución dplyr para este problema. Podemos usar la función group_by para agrupar el data.frame por id, y luego usar la función mutate para añadir las nuevas columnas cum.start y cum.end. Luego podemos usar la función cumsum para calcular la suma acumulada dentro de cada grupo.

    Aquí está el código:

    “`{r}
    library(dplyr)

    df %>%
    group_by(id) %>%
    mutate(cum.start = c(start[1], diff(end) + 1),
    cum.end = cumsum(diff(cum.start))) %>%
    ungroup()


    Este código produce la siguiente salida:

    Una tabla: 7 x 5

    id start end cum.start cum.end

    1 id1 101 154 1 54
    2 id1 220 246 55 81
    3 id1 307 326 82 101
    4 id2 550 625 1 76
    5 id2 658 712 77 131
    6 id2 742 811 132 201
    7 id2 855 944 202 291
    “`

    En la función mutate, primero calculamos la diferencia entre end y su correspondiente start anterior, y le sumamos 1 para obtener la longitud de cada intervalo. Luego usamos cumsum para calcular la suma acumulada de estas longitudes de intervalo, lo que nos da las coordenadas de inicio y fin acumulativas para cada grupo. Por último, usamos ungroup para eliminar la agrupación.

Comments are closed.