3

私は大規模なデータフレーム (800 変数の 40000 観測) を持っており、内積に似たものですべての観測の列の範囲を操作したいと考えています。これが私がそれを実装した方法です:

matrixattempt <- as.matrix(dframe)
takerow <- function(k) {as.vector(matrixattempt[k,])}
takedot0 <- function(k) {sqrt(sum(data0averrow * takerow(k)[2:785]))}

for (k in 1:40000){
print(k)
dframe$dot0aver[k]<-takedot0(k)
}

印刷は、何が起こっているかを追跡するためのものです。 data0averowは、事前定義されたtakerow(k)[2:785]と同じサイズの数値ベクトルです。

これは実行されており、いくつかのテストでは正しく実行されていますが、非常に遅いです。

列のサブセットの内積を検索したところ、この質問が見つかりましたが、セットアップに適用する方法がわかりませんでした。ddply の方が高速に動作するように思えます (ただし、分割はしたくないので、参照された質問者が行ったのと同じ define-id トリックを使用する必要があります)。洞察/ヒントはありますか?

4

2 に答える 2

3

これを試して:

sqrt(colSums(t(matrixattempt[, 2:785])  * data0averrow))

または同等:

sqrt(matrixattempt[, 2:785] %*% data0averrow)
于 2013-06-16T06:26:52.590 に答える
2

結果に行列の乗算と rowSums を使用します。

dframe$dot0aver <- NA
dframe$dot0aver[2:785] <- sqrt( rowSums( 
                              matrixattempt[2:785,] %*% data0averrow ))

data0aver範囲内の各行の内積の平方根です

于 2013-06-16T06:19:19.003 に答える