快速获取每个矩阵列的topN元素

时间:2014-10-29 17:13:56

标签: r recommendation-engine

这是recommenderlab包中的代码段,它带有等级的矩阵,并为每个用户返回前5个元素 -

reclist <- apply(ratings, MARGIN=2, FUN=function(x) 
  head(order(x, decreasing=TRUE, na.last=NA), 5))

对于大型矩阵(> 10K列),运行时间太长,有没有办法重新编写它以提高效率?也许通过使用dpyr或data.table包)?编写C ++代码不是我的选择

1 个答案:

答案 0 :(得分:2)

data.table和base R

的答案
# 10000 column dummy matrix
cols <- 10000
mat <- matrix(rnorm(100*cols), ncol=cols)

使用data.table:

library(data.table)
dt1 <- data.table(mat)
# sort every column, return first 5 rows
dt1[, lapply(.SD, sort, decreasing=T)][1:5]
system.time(dt1[, lapply(.SD, sort, decreasing=T)][1:5])

结果:

 user  system elapsed 
2.904   0.013   2.916 

在普通的老基地,它实际上更快! (感谢评论Arun)

system.time(head(apply(mat, 2, sort, decreasing=T), 5))

 user  system elapsed 
0.473   0.002   0.475 

但是,根据system.time()

,两者都比上面的代码示例更快
system.time(
apply(mat, MARGIN=2, FUN=function(x) {
  head(order(x, decreasing=TRUE, na.last=NA), 5)
}))

user  system elapsed 
3.063   0.031   3.094