আপনি যদি কোনও 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"]
বেঞ্চমার্কিং:
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)
এই মাত্রাগুলির ডেটা প্রায় 11 গুণ দ্রুত এবং data.tableস্কেলগুলি খুব ভাল pretty
সম্পাদনা করুন: যদি সর্বোচ্চ আইডির কোনওটি ঠিক থাকে তবে:
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"]