Если вас интересует 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"]