Sprawdź, czy pozycja x znajduje się pomiędzy pozycjami początkowymi (i = 1 do i = max) i końcowymi (i = 1 do i = max) zapisanymi na listach
Mam prostą ramkę danych z określeniem pozycji początkowej i końcowej na listach. Te pozycje początkowe i końcowe określają liczbę regionów. Teraz chciałbym sprawdzić, czy dana pozycja leży w takim regionie, a jeśli tak, to muszę wiedzieć, w którym regionie (i).
Oto prosta przykładowa ramka danych:
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)
Gdy mam tylko jedną pozycję początkową i końcową, nie stanowi to problemu (jak w przykładzie w wierszu 2):
data.table::between(example$position[[1]], example$start[[1]], example$end[[1]])
[1] FALSE TRUE FALSE
Jak mogę przekształcić to w funkcję, która sprawdza tę parę parami dla każdego elementu (od i = 1 do i = max) w ramach przykładu $ start i example $ end?
Drugim krokiem byłoby pobranie, dla którego regionu i (1 do imax) jest to PRAWDA.
Dziękuję Ci.
Odpowiedzi
Wygląda na to, że szukasz takiej funkcji.
Jako swój start
i end
to listy, można unlist
. Aby sprawdzić każdy element parami, możesz przejść do pętli start
i end
do imax
.
Zakładając, że możesz mieć więcej niż jeden region, możesz zwrócić listę (lub coś innego) na końcu funkcji.
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)
Wynik
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