我是R.的新手.现在我的功能如下:
funItemAverRating = function()
{
itemRatingNum = array(0, itemNum);
print("begin");
apply(input, 1, function(x)
{
itemId = x[2]+1;
itemAverRating[itemId] <<- itemAverRating[itemId] + x[3];
itemRatingNum[itemId] <<- itemRatingNum[itemId] + 1;
}
);
}
Run Code Online (Sandbox Code Playgroud)
在这个函数中输入是一个n*3数据框,n是~6*(10e+7),itemRatingNum是一个大小的向量~3*(10e+5).
我的问题是为什么apply功能这么慢(完成需要将近一个小时)?此外,随着函数的运行,它会使用越来越多的内存.但正如您所看到的,变量都是在apply函数外部定义的.有谁能够帮我?
程
它很慢,因为你多次调用高级R函数.
你必须对你的函数进行向量化,这意味着应该在所有数据向量上计算大多数操作(如<-或+1).
例如,它在我看来itemRatingNum保持input[[2]](第二列input data.frame)的频率可以被替换为:
tb <- table(input[[2]]+1)
itemRatingNum[as.integer(names(tb))] <- tb
Run Code Online (Sandbox Code Playgroud)
不要那样做.你遵循一个完全不像R的逻辑.如果我理解正确,您希望itemAverRating从某个输入数据帧的第三列添加某个向量的值.
什么itemRatingNum是干什么的,是相当模糊的.它不会在全局环境中结束,它只是在循环结束时变成一个充满频率的向量.在函数中定义itemRatingNum时,<<-赋值也会在函数的本地环境中赋值,并在函数结束时被销毁.
接下来,您应该给出函数输入,并获得一些输出.如果没有必要,永远不要分配到全球环境.你的函数相当于 - 相当快一点 - 跟随函数,它接受输入并提供输出:
funItemAverRating = function(x,input){
sums <- rowsum(input[,3],input[,2])
sumid <- as.numeric(rownames(sums))+1
x[sumid]+c(sums)
}
Run Code Online (Sandbox Code Playgroud)
按照MAREKS评论编辑的功能
其工作方式如下:
# make data
itemNum <- 10
set.seed(12)
input <- data.frame(
a1 = rep(1:10,itemNum),
a2 = sample(9:0,itemNum*10,TRUE),
a3 = rep(10:1,itemNum)
)
itemAverRating <- array(0, itemNum)
itemAverRating <- funItemAverRating(itemAverRating,input)
itemAverRating
0 1 2 3 4 5 6 7 8 9
39 65 57 36 62 33 98 62 60 38
Run Code Online (Sandbox Code Playgroud)
如果我尝试你的代码,我得到:
> funItemAverRating()
[1] "begin"
...
> itemAverRating
[1] 39 65 57 36 62 33 98 62 60 38
Run Code Online (Sandbox Code Playgroud)
哪个是一样的.如果你想要itemRatingNum,那么就这样做:
> itemRatingNum <- table(input[,2])
0 1 2 3 4 5 6 7 8 9
6 11 11 8 10 6 18 9 13 8
Run Code Online (Sandbox Code Playgroud)