3

実行に 1 時間以上かかる単純なループで立ち往生しており、それを高速化するために助けが必要です。

基本的に、31 列と 400,000 行の行列があります。最初の 30 列には値があり、31 番目の列には列番号があります。行ごとに、31 番目の列で示される列の値を取得する必要があります。

行の例: [26,354,72,5987..,461,3] (これは、列 3 の値が検索されることを意味します (72))

遅すぎるループは次のようになります。

a <- rep(0,nrow(data)) #To pre-allocate memory
for (i in 1:nrow(data)) {
   a[i] <- data[i,data[i,31]]
}

私はこれがうまくいくと思います:

a <- data[,data[,31]]

...しかし、「エラー: サイズ 2.8 Mb のベクトルを割り当てることができません」という結果になります。

これは非常に単純な質問なのではないかと心配しているので、apply、lapply、reshape などを理解しようと何時間も費やしましたが、どういうわけか R のベクトル化の概念を把握できません。

マトリックスには実際にはさらに多くの列があり、それらはパラメーターにも渡されます。そのため、マトリックスを再構築したり分割したりしたくありません。

あなたのサポートは高く評価されています!

クリス

4

3 に答える 3

2
t(data[,1:30])[30*(0:399999)+data[,31]]

これが機能するのは、行列を配列形式とベクトル形式 (この場合は 400000*31 の長さのベクトル) の両方で最初に列方向にカウントして参照できるためです。行ごとにカウントするには、転置を使用します。

于 2010-07-07T10:20:38.653 に答える
0

行列の単一インデックス表記では、使用するメモリが少なくなる場合があります。これには、次のようなことを行う必要があります。

i <- nrow(data)*(data[,31]-1) + 1:nrow(data)
a <- data[i]

以下は、Rの行列の単一インデックス表記の例です。この例では、行ごとの最大値のインデックスがランダム行列の最後の列として追加されます。次に、この最後の列を使用して、単一インデックス表記を使用して行ごとの最大値を選択します。

## create a random (10 x 5) matrix                                                                                                                           
M <- matrix(rpois(50,50),10,5)
## use the last column to index the maximum value of the first 5                                                                                             
## columns                                                                                                                                                   
MM <- cbind(M,apply(M,1,which.max))
##             column ID          row ID                                                                                                                     
i <- nrow(MM)*(MM[,ncol(MM)]-1) + 1:nrow(MM)
all(MM[i] == apply(M,1,max))

インデックスマトリックスを使用することは、おそらくより多くのメモリを使用するが、わずかに明確な代替手段です。

ii <- cbind(1:nrow(MM),MM[,ncol(MM)])
all(MM[ii] == apply(M,1,max))
于 2010-07-07T11:55:11.530 に答える
0

一度に1列ずつ機能するようにコードを変更してみてください。

M <- matrix(rpois(30*400000,50),400000,30)
MM <- cbind(M,apply(M,1,which.max))
a <- rep(0,nrow(MM))
for (i in 1:(ncol(MM)-1)) {
    a[MM[, ncol(MM)] == i] <- MM[MM[, ncol(MM)] == i, i]
}

これにより、最後の列の値がiの場合、aすべての要素が列iの値に設定されます。ベクトルaを計算するよりも、行列を作成するのに時間がかかりました。

于 2010-07-07T17:59:12.637 に答える