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
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
Parece que você está procurando uma função como esta.
Como suas listas start
e end
são, você pode unlist
. Para verificar cada elemento aos pares, você pode percorrer start
e end
até 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