Если вас интересует data.tableрешение, вот оно. Это немного сложно, поскольку вы предпочитаете получать идентификатор для первого максимума. Намного проще, если вы хотите получить последний максимум. Тем не менее, это не так уж сложно и быстро!
Здесь я сгенерировал данные ваших размеров (26746 * 18).
Данные
set.seed(45)
DF <- data.frame(matrix(sample(10, 26746*18, TRUE), ncol=18))
data.table ответ:
require(data.table)
DT <- data.table(value=unlist(DF, use.names=FALSE),
colid = 1:nrow(DF), rowid = rep(names(DF), each=nrow(DF)))
setkey(DT, colid, value)
t1 <- DT[J(unique(colid), DT[J(unique(colid)), value, mult="last"]), rowid, mult="first"]
Бенчмаркинг:
system.time({
DT <- data.table(value=unlist(DF, use.names=FALSE),
colid = 1:nrow(DF), rowid = rep(names(DF), each=nrow(DF)))
setkey(DT, colid, value)
t1 <- DT[J(unique(colid), DT[J(unique(colid)), value, mult="last"]), rowid, mult="first"]
})
system.time(t2 <- colnames(DF)[apply(DF,1,which.max)])
identical(t1, t2)
Он примерно в 11 раз быстрее обрабатывает данные этих размеров и data.tableнеплохо масштабируется.
Изменить: если любой из максимальных идентификаторов в порядке, то:
DT <- data.table(value=unlist(DF, use.names=FALSE),
colid = 1:nrow(DF), rowid = rep(names(DF), each=nrow(DF)))
setkey(DT, colid, value)
t1 <- DT[J(unique(colid)), rowid, mult="last"]