Jika Anda tertarik dengan data.tablesolusinya, inilah satu. Agak rumit karena Anda lebih suka mendapatkan id untuk maksimum pertama. Jauh lebih mudah jika Anda lebih suka yang terakhir. Namun demikian, ini tidak terlalu rumit dan cepat!
Di sini saya telah menghasilkan data dimensi Anda (26746 * 18).
Data
set.seed(45)
DF <- data.frame(matrix(sample(10, 26746*18, TRUE), ncol=18))
data.table menjawab:
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"]
Pembandingan:
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)
Ini sekitar 11 kali lebih cepat pada data dimensi ini, dan juga data.tableberskala cukup baik.
Edit: jika salah satu dari id maksimum tidak apa-apa, maka:
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"]