这是来自recommenderlab包的代码片段,它接受带有评级的矩阵,并返回每个用户的前5个元素-
reclist <- apply(ratings, MARGIN=2, FUN=function(x)
head(order(x, decreasing=TRUE, na.last=NA), 5))对于大型矩阵(>10K列),运行时间太长,有没有办法重写它以提高效率?也许通过使用dpyr或data.table包)?编写C++代码对我来说不是一个选项
发布于 2014-10-29 17:39:57
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 https://stackoverflow.com/questions/26636699
复制相似问题