หากคุณสนใจdata.tableวิธีแก้ปัญหานี่คือวิธีหนึ่ง ค่อนข้างยุ่งยากเนื่องจากคุณต้องการรับ id เป็นจำนวนสูงสุดครั้งแรก ง่ายกว่ามากถ้าคุณต้องการสูงสุดครั้งสุดท้าย ถึงกระนั้นมันก็ไม่ซับซ้อนและรวดเร็ว!
ที่นี่ฉันสร้างข้อมูลขนาดของคุณ (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สเกลก็ค่อนข้างดีด้วย
แก้ไข: หากรหัสสูงสุดใด ๆ ถูกต้องให้ทำดังนี้
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"]