यदि आप एक 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"]