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
확장도 꽤 좋습니다.
편집 : 최대 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"]