Wenn Sie an einer data.table
Lösung interessiert sind, finden Sie hier eine. Es ist etwas schwierig, da Sie es vorziehen, die ID für das erste Maximum zu erhalten. Es ist viel einfacher, wenn Sie lieber das letzte Maximum wollen. Trotzdem ist es nicht so kompliziert und schnell!
Hier habe ich Daten Ihrer Dimensionen generiert (26746 * 18).
Daten
set.seed(45)
DF <- data.frame(matrix(sample(10, 26746*18, TRUE), ncol=18))
data.table
Antworten:
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"]
Benchmarking:
# 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
Bei Daten dieser Dimensionen ist es ungefähr elfmal schneller und lässt sich auch data.table
ziemlich gut skalieren.
Bearbeiten: Wenn eine der maximalen IDs in Ordnung ist, dann:
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"]