На самом деле очень хорошая проблема, к которой я пришел с решением (см. Ниже), но это не очень красиво:
Предположим, у вас есть вектор x и a матрица A , которая содержит начало интервала в первом столбце и конец интервала во втором.
Как я могу получить элементов A , которые попадают в интервалы, заданные A ?
x <- c(4, 7, 15)
A <- cbind(c(3, 9, 14), c(5, 11, 16))
Ожидаемый результат:
[1] 4 15
Вы можете предоставить следующую информацию, если это поможет повысить производительность:
Вектор и строки матрицы упорядочены, а интервалы не перекрываются .Все интервалы имеют одинаковую длину .Все числа являются целыми числами , но могут быть огромными .
Теперь я не хотел быть ленивым и придумал следующее решение, которое слишком долго работает медленновекторы и матрицы:
x <- c(4, 7, 15) # Define input vector
A <- cbind(c(3, 9, 14), c(5, 11, 16)) # Define matrix with intervals
b <- vector()
for (i in 1:nrow(A)) {
b <- c(b, A[i, 1]:A[i, 2])
}
x[x %in% b]
Я знаю, что циклы в R могут быть медленными, но я не знал, как написать операцию без таковой (возможно, есть способ с apply
).