这是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 :(得分: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