мне нужно найти первое отрицательное число в каждом столбце матрицы - PullRequest
3 голосов
/ 24 апреля 2019

Здравствуйте, мне нужно найти позицию первого отрицательного числа для каждого вектора строки в матрице

я пробовал с match и apply, но он показывает только первый

z<-matrix(c(-3,2,-1,3,2,-2,3,-4,-1),ncol=3)
k<-z<0
h<-apply(k,1,function(x) match(TRUE,k))

я хочу это показать [1,3,2] но он показывает только первое совпадение всей матрицы [1,1,1]

Ответы [ 2 ]

3 голосов
/ 24 апреля 2019

Мы можем использовать max.col с ties.method = "first", чтобы получить первое отрицательное число

max.col(z < 0, ties.method = "first")
#[1] 1 3 1

С apply вы можете сделать

apply(z < 0, 1, which.max)

Оба этих подхода требуют хотя бы одного отрицательного числа в строке, иначе он вернет первый индекс. Чтобы избежать этого, мы можем проверить с помощью rowSums, есть ли хотя бы одно отрицательное число в строке, а затем использовать max.col. Строки без отрицательного значения получат 0 тогда.

(rowSums(z < 0) > 0) * max.col(z < 0, ties.method = "first")
2 голосов
/ 24 апреля 2019

Альтернативная попытка изменения OP,

apply(z<0, 1, function(x) which(x)[1])
# [1] 1 3 1

Преимущество состоит в том, что в строке нет отрицательных значений, возвращается NA, а не 1. Например,

z2 <- structure(c(-3, 2, -1, 3, 2, -2, 3, 0, -1), .Dim = c(3L, 3L))
apply(z2<0, 1, function(x) which(x)[1])
[1]  1 NA  1

Edit

Немного быстрее использовать функцию соответствия:

apply(z<0, 1, function(x) match(TRUE, x))
# [1] 1 3 1
...