Якщо вас цікавить 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"]
Бенчмаркінг:
# data.table solution
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"]
})
# user system elapsed
# 0.174 0.029 0.227
# apply solution from @thelatemail
system.time(t2 <- colnames(DF)[apply(DF,1,which.max)])
# user system elapsed
# 2.322 0.036 2.602
identical(t1, t2)
# [1] TRUE
Це приблизно в 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"]