首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取每个矩阵列topN元素的快速方法

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

Stack Overflow用户
提问于 2014-10-29 17:13:55
回答 1查看 393关注 0票数 1

这是来自recommenderlab包的代码片段,它接受带有评级的矩阵,并返回每个用户的前5个元素-

代码语言:javascript
复制
reclist <- apply(ratings, MARGIN=2, FUN=function(x) 
  head(order(x, decreasing=TRUE, na.last=NA), 5))

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-29 17:39:57

data.table和基数R的一个答案

代码语言:javascript
复制
# 10000 column dummy matrix
cols <- 10000
mat <- matrix(rnorm(100*cols), ncol=cols)

使用data.table:

代码语言:javascript
复制
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])

结果:

代码语言:javascript
复制
 user  system elapsed 
2.904   0.013   2.916 

在朴素的老基地,它实际上更快!(谢谢您的评论)

代码语言:javascript
复制
system.time(head(apply(mat, 2, sort, decreasing=T), 5))

 user  system elapsed 
0.473   0.002   0.475 

但是,根据system.time(),两者都比上面的代码示例更快

代码语言:javascript
复制
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 
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26636699

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档