Nếu bạn quan tâm đến một data.table
giải pháp, đây là một giải pháp. Nó hơi phức tạp vì bạn muốn lấy id ở mức tối đa đầu tiên. Sẽ dễ dàng hơn nhiều nếu bạn muốn có mức tối đa cuối cùng. Tuy nhiên, nó không phức tạp và nhanh chóng!
Tại đây, tôi đã tạo dữ liệu về kích thước của bạn (26746 * 18).
Dữ liệu
set.seed(45)
DF <- data.frame(matrix(sample(10, 26746*18, TRUE), ncol=18))
data.table
câu trả lời:
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"]
Điểm chuẩn:
# 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
Nó nhanh hơn khoảng 11 lần đối với dữ liệu của các thứ nguyên này và cũng mở rộng data.table
quy mô khá tốt.
Chỉnh sửa: nếu bất kỳ id tối đa nào ổn, thì:
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"]