2014-10-29 34 views
1

TOPN元件这是从recommenderlab包的代码段,该取矩阵的评分,并返回每个用户顶部5个元素 -快速的方式来获得每个矩阵列

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

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

+0

有多少行,你呢? – Arun 2014-10-29 18:04:03

+0

在我的情况下,它只是100.但是,这里的行代表销售的商品,可能高达1M。所以这种情况对其他人来说可能很有趣 – RInatM 2014-10-30 09:42:26

回答

2

与data.table和基础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 

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

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 
+0

这里使用'data.table'的好处是什么? – Arun 2014-10-29 18:02:14

+0

是的,好点。自从OP提到它之后我就这样做了,但是当我比较头脑时,直接在矩阵上运行会更快。 – arvi1000 2014-10-29 18:09:38

+1

不用担心。 'apply + sort'似乎很棒!也许尝试使用'partial = 5L'的'sort.int' ...虽然这个瓶颈似乎是'排序/排序'。 'data.table'的内部基数顺序'forderv'(尚未导出)可能是有用的,特别是如果还有很多行! – Arun 2014-10-29 18:21:15