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

Nov 28 2020

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

Ben Nov 28 2020 at 21:48

Wygląda na to, że szukasz takiej funkcji.

Jako swój starti endto listy, można unlist. Aby sprawdzić każdy element parami, możesz przejść do pętli starti enddo 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