Teste se a posição x está entre qualquer posição inicial (i = 1 a i = max) e final (i = 1 a i = max) armazenada nas listas

Nov 28 2020

Eu tenho um quadro de dados simples com posições iniciais e finais específicas nas listas. Essas posições inicial e final definem um número i de regiões. Agora gostaria de testar se uma determinada posição se encontra dentro de tal região e se sim eu preciso saber em qual região (i).

Aqui está um exemplo simples de quadro de dados:

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)

Quando tenho apenas uma posição inicial e final, não há problema (como na linha 2 do exemplo):

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

[1] FALSE  TRUE FALSE

Como posso transformar isso em uma função que verifica isso em pares para cada elemento (de i = 1 a i = max) no exemplo $ start e exemplo $ end?

A segunda etapa seria recuperar para qual região i (1 a imax) isso era VERDADEIRO.

Obrigado.

Respostas

Ben Nov 28 2020 at 21:48

Parece que você está procurando uma função como esta.

Como suas listas starte endsão, você pode unlist. Para verificar cada elemento aos pares, você pode percorrer starte endaté imax.

Supondo que você possa ter mais de uma região, você pode retornar uma lista (ou outra coisa) no final da função.

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)

Resultado

      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