问题
I have a simple data frame with specifies start and end positions within lists. These start and end positions define i number of regions. Now I would like to test whether a given position lies within such a region and if yes I need to know in which region (i).
Here is a simple example data frame:
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)
When I have only one start and end position it is no problem (as in row 2 of example):
data.table::between(example$position[[1]], example$start[[1]], example$end[[1]])
[1] FALSE TRUE FALSE
How can I turn this into a function which checks this pairwise for every element (from i=1 to i=max) within example$start and example$end?
The second step would be to retrieve for which region i (1 to imax) this was TRUE.
Thank you.
回答1:
It sounds like you might be looking for a function like this.
As your start and end are lists, you can unlist. To check each element pairwise, you can loop through start and end up to imax.
Assuming you can have more than one region, you can return a list (or something else) at the end of the function.
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)
Output
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
来源:https://stackoverflow.com/questions/65049499/test-whether-position-x-is-between-any-start-i-1-to-i-max-and-end-i-1-to-i-ma