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.

Dividir algunas secuencias de datos en varias partes contiguas

Tengo un par de secuencias que quiero descomponer en series de números adyacentes. Las secuencias están anidadas dentro de una lista de individuos de tal manera que el tamaño de la ventana que contiene los números adyacentes varía de un individuo a otro. Aquí tienes algunos datos de ejemplo:

# Las secuencias de tres individuos
sequences <- list(c(1,2,3,5,6), c(2,3,4,5,6), c(1,3,4,6,7))

# El tamaño de la ventana que contiene los números adyacentes
# para el primer individuo, 2 números adyacentes deben estar unidos y para el segundo, 3 deben estar unidos, etc.
windowsize <- list(2,3,4)

# La descomposición de los números adyacentes debería verse así:
[[1]]
[[1]][[1]]
[1] 1 2
[[1]][[2]]
[1] 2 3
[[1]][[3]]
[1] 3 5
[[1]][[4]]
[1] 5 6

[[2]]
[[2]][[1]]
[1] 2 3 4
[[2]][[2]]
[1] 3 4 5
[[2]][[3]]
[1] 4 5 6

[[3]]
[[3]][[1]]
[1] 1 3 4 6
[[3]][[2]]
[1] 3 4 6 7

Tengo un conjunto de datos mucho más grande que esto, por lo que estoy pensando en escribir una función tal vez sea la forma de lograr esto. ¡Gracias!

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Sí, escribir una función para automatizar este proceso para un conjunto de datos más grande es una buena idea. Aquí hay una función de ejemplo que toma las secuencias y los tamaños de ventana como entrada y produce el desglose deseado de los números adyacentes:

    breakdown_sequences <- function(sequences, windowsize) {
    
      # inicializar una lista para almacenar la salida
      output <- list()
    
      # iterar a través de cada secuencia e tamaño de ventana individual
      for(i in seq_along(sequences)) {
    
        # inicializar una lista para almacenar el desglose de los números adyacentes
        individual_output <- list()
    
        # iterar a través de la secuencia incrementando el tamaño de ventana en cada paso
        for(j in seq(1, length(sequences[[i]]) - windowsize[[i]] + 1, by = 1)) {
    
          # extraer una ventana de números adyacentes
          window <- sequences[[i]][j:(j + windowsize[[i]] - 1)]
    
          # agregar la ventana a la lista de salida del individuo
          individual_output[[j]] <- window
        }
    
        # agregar la lista de salida del individuo a la salida
        output[[i]] <- individual_output
      }
    
      # devolver la salida final
      return(output)
    }
    

    Luego puedes llamar a esta función en tus datos de ejemplo de la siguiente manera:

    breakdown_sequences(sequences, windowsize)
    

    Lo cual produce el desglose deseado:

    [[1]]
    [[1]][[1]]
    [1] 1 2
    
    [[1]][[2]]
    [1] 2 3
    
    [[1]][[3]]
    [1] 3 5
    
    [[1]][[4]]
    [1] 5 6
    
    
    [[2]]
    [[2]][[1]]
    [1] 2 3 4
    
    [[2]][[2]]
    [1] 3 4 5
    
    [[2]][[3]]
    [1] 4 5 6
    
    
    [[3]]
    [[3]][[1]]
    [1] 1 3 4 6
    
    [[3]][[2]]
    [1] 3 4 6 7
    

Comments are closed.