Wenn Sie an einer data.tableLö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.tableziemlich 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"]