위치 x가 목록에 저장된 시작 (i = 1 ~ i = max)과 끝 (i = 1 ~ i = max) 위치 사이에 있는지 테스트

Nov 28 2020

목록 내에서 시작 및 끝 위치를 지정하는 간단한 데이터 프레임이 있습니다. 이러한 시작 및 끝 위치는 i 개의 영역을 정의합니다. 이제 주어진 위치가 그러한 지역 내에 있는지 테스트하고 싶습니다. 그렇다면 어떤 지역 (i)에 있는지 알아야합니다.

다음은 간단한 예제 데이터 프레임입니다.

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)

시작 위치와 끝 위치가 하나만 있으면 문제가되지 않습니다 (예제 2 행에서와 같이).

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

[1] FALSE  TRUE FALSE

어떻게 이것을 example $ start 및 example $ end 내의 모든 요소 (i = 1에서 i = max까지)에 대해 쌍으로 확인하는 함수로 바꿀 수 있습니까?

두 번째 단계는 어떤 영역 i (1 ~ imax)가 TRUE인지 검색하는 것입니다.

감사합니다.

답변

Ben Nov 28 2020 at 21:48

이와 같은 기능을 찾고있는 것 같습니다.

당신의로 startend목록은, 당신은 할 수 있습니다 unlist. 수행 할 수 있습니다 루프를 통해 각 요소의 페어 확인하려면 startend최대를 imax.

둘 이상의 영역을 가질 수 있다고 가정하면 함수 끝에 목록 (또는 다른 항목)을 반환 할 수 있습니다.

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)

산출

      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