Альтернативная попытка изменения 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