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関数がとても遅いのですか(終了するのに1時間近くかかるでしょう)?また、関数が実行されると、ますます多くのメモリを使用します。しかし、ご覧のとおり、変数はすべてapply関数の外部で定義されています。誰か助けてもらえますか?

チェン

4

2 に答える 2

7

高レベルのR関数を何度も呼び出すため、時間がかかります。

関数をベクトル化する必要があります。つまり、ほとんどの操作(<-またはなど+1)はすべてのデータベクトルに対して計算する必要があります。

たとえば、次のように置き換えることができる(の2番目の列)のitemRatingNum頻度を保持しているように見えます。input[[2]]input data.frame

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

そうしないでください。あなたは完全にRに似ていない論理に従っています。itemAverRating私が正しく理解していれば、ある入力データフレームの3番目の列の値を特定のベクトルに追加したいとします。

itemRatingNumをしているのか、かなりあいまいです。それは地球環境に行き着くのではなく、ループの終わりで周波数で満たされたベクトルになるだけです。関数内でitemRatingNumを定義すると、<<-割り当てによって関数のローカル環境内でもitemRatingNumが割り当てられ、関数が終了すると破棄されます。

次に、関数を入力し、出力を取得する必要があります。必要がない場合は、グローバル環境に割り当てないでください。あなたの関数は、入力を受け取り、出力を与える次の関数と同等です-かなり高速です:

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

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 

私があなたのコードを試してみると、私は次のようになります:

> 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 に答える