2014-12-14 5 views
2

я следующая проблема с функцией R (findInterval)Векторизация findInterval()

Учитывая вектор Х и матрица Y, я хочу найти, в котором интервал лежат элементы интервалов X. построены, имеющие точки останова в Y строк. Другими словами, для X = c (2,3) и Y = матрицы (c (3,1,4,2,5,4), 2,3) выход будет c (0,2). Я написал следующий код:

X <- c(2,3) 
Y <- matrix(c(3,1,4,2,5,4),2,3) 

output <- diag(apply(Y,1,function(z)findInterval(X,z))) 

и он работает. Однако, я думаю, он может быть оптимизирован, так как функция apply возвращает 2 x 2 матрицы (вот почему я должен был получить диагональ этого). Есть ли способ сделать то же самое, но используя функцию, которая вернет вектор, взяв в качестве аргумента мой вектор X и матрицу Y? Я выполняю эту операцию на высокоразмерных векторах, поэтому получение ненужных матриц размером 10000 x 10000 не является хорошей идеей imho. Чтобы максимизировать эффективность, я не хочу использовать циклы.

Заранее благодарим за любые отзывы.

+1

Может 'mapply (findInterval, X, data.frame (т (Y)))'? – MrFlick

+0

Спасибо! Я попытался использовать mapply, но я совершенно новый. Какая уловка при конвертации в df. Я имею в виду, я не понимаю вывод 0 0 0 1 1 0 из mapply (findInterval, X, t (Y)). Не следует ли применять функцию к первому элементу X (2) и первому столбцу t (Y) (3,4,5), а затем ко второму, давая результат c (0,2)? – user2280549

ответ

2

Вы можете сделать

rowSums(X > Y) 
# [1] 0 2 
+1

Отличная идея! Большое спасибо! – user2280549

Смежные вопросы