Подтвердить что ты не робот

Получение индекса первого появления значения в каждом столбце матрицы

Если у меня есть один вектор, я могу получить первое вхождение, которое ниже значения:

test <- c(0.5,0.8,0.1,0.08,0.06,0.04)
which(test<0.1)[1]    

который правильно дает ответ как 4. Однако как я могу получить первое вхождение в каждом столбце матрицы, например, самое раннее появление ниже 5 в следующей матрице столбца:

test2 <- matrix(c(5,8,3,4,7,5,6,2),ncol=2)

Использование apply с which возвращает список:

> apply(test2<5,2,which)
[[1]]
[1] 3 4

[[2]]
[1] 4

при использовании apply с which.min возвращает 1 для всех столбцов:

> apply(test2<5,2,which.min)
[1] 1 1

тогда как я хочу просто вернуть [1] 3 4 - я пропущу что-то очевидное?

4b9b3361

Ответ 1

Вот еще один ответ. Предполагая, что вы имеете в виду test2, где вы пишете test3, обратите внимание, что "test2 < 5" является логическим вектором. Минимальное значение будет FALSE. Максимальное значение (TRUE) - это то, что вы хотите:

> apply(test2<5,2,which.max)
[1] 3 4

Обратите внимание, что это неверно, если максимальное значение не является TRUE.

Ответ 2

Попробуйте следующее:

test2 <- matrix(c(5,8,3,4,7,5,6,2),ncol=2)
> test2
     [,1] [,2]
[1,]    5    7
[2,]    8    5
[3,]    3    6
[4,]    4    2
> foo <- function(x){which(x < 5)[1]}
> apply(test2,2,foo)

Ключевым моментом является то, что вы берете кусок, который, как вы знаете, работает на одном векторе, и просто оберните его в функцию. apply будет применять эту функцию к каждому столбцу.

Ответ 3

Потому что я просто наткнулся на это, вот еще одно решение:

max.col(t(test2 < 5), "first")

Ответ 4

Как отмечено Мэтью, which.max не возвращает правильное значение, если в столбце нет значения < 5 (он возвращает 1, тогда как правильное значение - "ничего" ). Функция match хороша для обработки этого случая:

> test2 <- matrix(c(5,8,3,4, 7,5,6,7), ncol=2)
> apply(test2<5, 2, which.max)
[1] 3 1
> apply(test2<5, 2, function(x) match(TRUE, x))
[1]  3 NA