Pruebe si la posición x está entre cualquier posición inicial (i = 1 a i = max) y final (i = 1 a i = max) almacenadas en listas

Nov 28 2020

Tengo un marco de datos simple que especifica las posiciones inicial y final dentro de las listas. Estas posiciones inicial y final definen un número de regiones. Ahora me gustaría probar si una posición determinada se encuentra dentro de dicha región y, en caso afirmativo, necesito saber en qué región (i).

Aquí hay un marco de datos de ejemplo simple:

start <- list(c(5,10,15), c(5) ,c(6,11),c(6,11))
end <- list(c(7,11,17), c(10), c(8,12),c(8,12))
imax <- c(3,1,2,2)
position <- c(11,6,9,8)

example <- data.frame(start = I(start), end = I(end), imax = imax, position = position)

Cuando tengo solo una posición inicial y final, no hay problema (como en la fila 2 del ejemplo):

data.table::between(example$position[[1]], example$start[[1]], example$end[[1]])

[1] FALSE  TRUE FALSE

¿Cómo puedo convertir esto en una función que verifique esto por pares para cada elemento (desde i = 1 hasta i = max) dentro del ejemplo $ inicio y ejemplo $ final?

El segundo paso sería recuperar para qué región i (1 a imax) esto era VERDADERO.

Gracias.

Respuestas

Ben Nov 28 2020 at 21:48

Parece que está buscando una función como esta.

Como sus listas starty endson, puede hacerlo unlist. Para comprobar cada elemento por pares, puede recorrer starty endsubir imax.

Suponiendo que puede tener más de una región, puede devolver una lista (o algo más) al final de la función.

my_fun <- function(x) {
  vec <- integer(0)
  start <- unlist(x[["start"]])
  end <- unlist(x[["end"]])
  for (i in 1:x[["imax"]]) {
    if (between(x[["position"]], start[i], end[i])) vec <- c(vec, i)
  }
  list(vec)
}

example$regions <- apply(example, 1, my_fun)

Salida

      start       end imax position regions
1 5, 10, 15 7, 11, 17    3       11       2
2         5        10    1        6       1
3     6, 11     8, 12    2        9        
4     6, 11     8, 12    2        8       1