位置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)

開始位置と終了位置が1つしかない場合は、問題ありません(例の行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まで)についてペアごとにチェックする関数にするにはどうすればよいですか?

2番目のステップは、これがTRUEであった領域i(1からimax)を取得することです。

ありがとうございました。

回答

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