Один из вариантов - использовать mapply
. Вот воспроизводимый пример с использованием фиксированного случайного начального числа.
set.seed(2017)
r <- 10
c <- 10
m1 <- matrix(runif(r*c) > 0.5, r, c)
v1 <- round(runif(10,1,10))
mapply(function(x, y) { idx <- which(x == TRUE); idx[idx > y][1]}, as.data.frame(m1), v1, USE.NAMES = F)
#[1] NA NA 3 5 8 2 9 8 2 2
Объяснение: Для каждого столбца m1
мы извлекаем индексы TRUE
записей в idx
; затем мы возвращаем первый индекс idx
, который больше, чем запись с номером столбца в v1
; если такого числа не существует, оно автоматически возвращает NA
.
Примечание. Чтобы mapply
одновременно зацикливался на столбцах m1
и записях v1
, нам необходимо преобразовать m1
в data.frame
.
Пример данных
При вышеуказанном фиксированном случайном семени выборка данных составляет
m1
# [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
# [1,] TRUE TRUE TRUE TRUE TRUE TRUE FALSE TRUE FALSE TRUE
# [2,] TRUE FALSE FALSE FALSE TRUE TRUE FALSE TRUE TRUE TRUE
# [3,] FALSE FALSE TRUE FALSE FALSE FALSE TRUE FALSE TRUE TRUE
# [4,] FALSE FALSE TRUE FALSE FALSE TRUE TRUE TRUE TRUE TRUE
# [5,] TRUE FALSE FALSE TRUE TRUE TRUE TRUE TRUE FALSE TRUE
# [6,] TRUE FALSE TRUE TRUE TRUE FALSE FALSE FALSE FALSE FALSE
# [7,] FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE TRUE
# [8,] FALSE TRUE FALSE FALSE TRUE TRUE FALSE TRUE FALSE FALSE
# [9,] FALSE TRUE FALSE FALSE TRUE TRUE TRUE FALSE FALSE TRUE
#[10,] FALSE TRUE FALSE TRUE TRUE TRUE TRUE TRUE FALSE FALSE
v1
#[1] 9 10 2 3 6 1 5 6 1 1