Uji apakah posisi x berada di antara posisi awal (i = 1 hingga i = maks) dan akhir (i = 1 hingga i = maks) yang disimpan dalam daftar

Nov 28 2020

Saya memiliki bingkai data sederhana dengan menentukan posisi awal dan akhir dalam daftar. Posisi awal dan akhir ini menentukan sejumlah wilayah. Sekarang saya ingin menguji apakah suatu posisi berada dalam wilayah seperti itu dan jika ya, saya perlu tahu di wilayah mana (i).

Berikut ini contoh data frame sederhana:

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)

Ketika saya hanya memiliki satu posisi awal dan akhir, itu tidak masalah (seperti pada baris 2 contoh):

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

[1] FALSE  TRUE FALSE

Bagaimana saya bisa mengubahnya menjadi fungsi yang memeriksa berpasangan ini untuk setiap elemen (dari i = 1 ke i = max) dalam contoh $ start dan contoh $ end?

Langkah kedua adalah mengambil di wilayah mana i (1 ke imaks) ini BENAR.

Terima kasih.

Jawaban

Ben Nov 28 2020 at 21:48

Sepertinya Anda mencari fungsi seperti ini.

Sebagai Anda startdan enddaftar, Anda bisa unlist. Untuk memeriksa setiap elemen secara berpasangan, Anda dapat melakukan loop melalui startdan endhingga imax.

Dengan asumsi Anda dapat memiliki lebih dari satu wilayah, Anda dapat mengembalikan daftar (atau yang lain) di akhir fungsi.

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)

Keluaran

      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