1

我是 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;
        }
    );
}

在这个函数中,输入是一个n*3数据框,n~6*(10e+7)itemRatingNum是一个大小为 的向量~3*(10e+5)
我的问题是为什么这个apply功能这么慢(需要将近一个小时才能完成)?此外,随着函数的运行,它会使用越来越多的内存。但是正如你所看到的,变量都是在apply函数之外定义的。有谁能够帮我?

4

2 回答 2

7

不要那样做。您正在遵循一个完全不像 R 的逻辑。如果我理解正确,您想将某个输入数据框中第三列的值添加到某个itemAverRating向量。

在做什么itemRatingNum,是相当模糊的。它不会在全局环境中结束,它只是在循环结束时变成一个充满频率的向量。当您在函数中定义 itemRatingNum 时,<<-分配也会在函数的本地环境中分配它,并且它会在函数结束时被销毁。

接下来,你应该给你的函数输入,并得到一些输出。如果没有必要,永远不要分配给全局环境。你的函数相当于 - 相当快得多 - 跟随函数,它接受输入并给出输出:

funItemAverRating = function(x,input){
    sums <- rowsum(input[,3],input[,2])
    sumid <- as.numeric(rownames(sums))+1
    x[sumid]+c(sums)
}

根据 Markes 评论编辑的功能

其工作方式如下:

# 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 

如果我尝试您的代码,我会得到:

> funItemAverRating()
[1] "begin"
...
> itemAverRating
 [1] 39 65 57 36 62 33 98 62 60 38

这是一样的。如果您想要 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 
于 2011-05-17T11:06:31.200 回答
7

它很慢,因为您多次调用高级 R 函数。

您必须对函数进行矢量化,这意味着应该对所有数据向量计算大多数操作(如<-or )。+1

例如,在我看来,它itemRatingNum拥有input[[2]](第二列input data.frame)的频率,可以替换为:

tb <- table(input[[2]]+1)
itemRatingNum[as.integer(names(tb))] <- tb
于 2011-05-17T10:25:02.820 回答