R: Проверьте, находятся ли элементы векторов внутри интервалов, заданных матрицей - PullRequest
0 голосов
/ 09 июня 2018

На самом деле очень хорошая проблема, к которой я пришел с решением (см. Ниже), но это не очень красиво:

Предположим, у вас есть вектор 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).

Ответы [ 2 ]

0 голосов
/ 09 июня 2018

Вот метод, который не использует явный цикл или функцию применения.outer иногда намного быстрее.

x[rowSums(outer(x, A[,1], `>=`) & outer(x, A[,2], `<=`)) > 0]

[1]  4 15
0 голосов
/ 09 июня 2018

Мы можем использовать sapply, чтобы зациклить каждый элемент x и определить, находится ли он в диапазоне any этих значений матрицы.

x[sapply(x, function(i) any(i > A[, 1] & i < A[,2]))]
#[1]  4 15

В случае, если length(x) и nrow(A) одинаковы, нам даже не нужен цикл sapply, и мы можем использовать это сравнение напрямую.

x[x > A[, 1] & x < A[,2]]
#[1]  4 15
...