2015-01-08 3 views
7

Я был уверен, что что-то в этом роде будет существовать (по линиям rowSums и т. Д.), Но я ничего не мог найти. В основном, это сделать:which.min by row без применения

apply(mx, 1, which.min) 

apply без использования, так что мы можем избежать накладных расходов вызова which.minnrow(mx) раз, что может быть большое количество.

+3

Помогает ли 'max.col' здесь? http://stackoverflow.com/questions/27404710/finding-the-column-number-of-the-smallest-element-in-a-certain-row – user20650

+0

@ user20650, удивительный, не могу поверить, что я пропустил его в docs для 'which.min'; пожалуйста, отправьте ответ, и я соглашусь. – BrodieG

+0

Пожалуйста, не стесняйтесь обновлять свои данные - вы уже сделали всю тяжелую работу – user20650

ответ

5

Благодаря @ user20650 для ответа:

set.seed(1) 
mx <- matrix(runif(1e7), ncol=5) 

С apply:

system.time(which.min.mx <- apply(mx, 1, which.min)) 
# user system elapsed 
# 4.7  0.0  4.7 

с max.col:

system.time(mx.mins.2 <- max.col(-mx, ties="first")) 
# user system elapsed 
# 0.12 0.00 0.13 
all.equal(which.min.mx, mx.mins.2) 
# [1] TRUE 

Старый Ответ: Это лучшее, что я подошел w Ith. Надеюсь, у кого-то есть что-то лучше, как встроенный в row.which.min или некоторые такие. Данные:

Использование pmin, ==, %%, и некоторый вектор рециркуляция:

system.time({ 
    row.min <- do.call(pmin, as.data.frame(mx)) 
    mx.mins <- which(t(mx == row.min)) %% ncol(mx) 
    mx.mins[!mx.mins] <- ncol(mx) 
}) 
# user system elapsed 
# 0.51 0.00 0.51 
all.equal(which.min.mx, mx.mins) 
# [1] TRUE 

Не говоря уже о таких падениях плашмя на его лицо, если есть больше чем один минимальное значение в строке.