3 回答

TA貢獻1853條經(jīng)驗 獲得超18個贊
如果你對data.table解決辦法,這是一個。這有點棘手,因為您更愿意獲得第一個最大值的id。如果你想要最后的最大值,那就容易多了。盡管如此,它并沒有那么復(fù)雜,而且速度很快!
這里我生成了你們維度的數(shù)據(jù)(26746*18)。
數(shù)據(jù)
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
這些維度的數(shù)據(jù)大約快11倍,而且data.table音階也很好。
編輯:如果任何最大ID都可以,那么:
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"]
- 3 回答
- 0 關(guān)注
- 1266 瀏覽
添加回答
舉報