3

および関連パッケージは初めてですbig.matrix。次の例を再現しようとしています`` `

Loading required package: stats
> Sys.setenv(LANG = "en")
> library(bigmemory)
Loading required package: bigmemory.sri

bigmemory >= 4.0 is a major revision since 3.1.2; please see package
biganalytics and http://www.bigmemory.org for more information.

> x <- big.matrix(5, 2, type="integer", init=0, dimnames=list(NULL, c("alpha", "beta")))
> x[,] <- round(rnorm(10))
Assignment will down cast from double to integer
Hint: To remove this warning type:  options(bigmemory.typecast.warning=FALSE)
Mensajes de aviso perdidos
In SetAll.bm(x, value) : 
> x
An object of class "big.matrix"
Slot "address":
<pointer: 0x22a1620>

> x[,]
     alpha beta
[1,]    -2    0
[2,]    -1    0
[3,]     0   -1
[4,]     2    1
[5,]     0    0
> apply(x, 1, mean)
Error en as.vector(data) : 
  ningún método para coaccionar a esta clase S4 a un vector

ドキュメントからですが、最後の行で次のエラーが発生します。

Error en as.vector(data) : 
  ningún método para coaccionar a esta clase S4 a un vector

最後の行は次のようなものを言います"there is no method for transform this S4 class to a vector"

ポインタを教えていただけますか?

私のRバージョンは

R.version
               _                            
platform       x86_64-unknown-linux-gnu     
arch           x86_64                       
os             linux-gnu                    
system         x86_64, linux-gnu            
status                                      
major          2                            
minor          15.1                         
year           2012                         
month          06                           
day            22                           
svn rev        59600                        
language       R                            
version.string R version 2.15.1 (2012-06-22)
nickname       Roasted Marshmallows    
4

3 に答える 3

2

applybigmemoryオブジェクトを呼び出そうとします。後者には、行列に変換するための暗黙的なメソッドがありません(適用に必要な引数)

apply(x, 1, mean)
Error in as.vector(data) : 
  no method for coercing this S4 class to a vector

行列への変換を強制し、問題を修正します

apply(as.matrix(x), 1, mean)
[1] -1.5 -0.5  1.0 -0.5 -0.5

OP回答後に編集:

パッケージbiganalyticsは、bigmemoryパッケージをさまざまな分析で拡張します。関数bigkmeansおよびbinitは、ネイティブRオブジェクトでも使用できます。ただし、注意してください。

big.matrixオブジェクトに適用します。big.matrixオブジェクトからのデータの抽出に関連するS4オーバーヘッドのために、パフォーマンスが低下する可能性があることに注意してください(通常のR行列に適用する場合と比較して)。この種の制限は避けられず、他の「カスタム」データ構造の場合(またはさらに悪いことに)になります。もちろん、これは、長い行または列に適用する場合にのみ部分的に重要になります。

Tapplyのような関数の場合、bigtabulate パッケージも役立つ場合があります。このパッケージのアイデアは、2つのステップで仕事をすることです。

分割によって生成されたサブセットが妥当なサイズである場合、bigsplitの後にlapplyまたはsapplyが続くことが特に効果的であることがわかりました。

于 2012-12-24T17:10:22.030 に答える
2

さて、前の答えのおかげでエラーを発見しました(#agstudy、私はあなたに+1を与えます)... applyメソッドはパッケージからのものでした、base私がパッケージをロードするとbiganalytics、すべてが魅力として機能します...

> library(biganalytics)
> apply(x, 1, mean)
[1]  0.0  1.5  0.5 -1.0  0.5

ありがとうございました!

于 2012-12-24T17:18:23.817 に答える
0

この回答は、@ agstudyが上記で回答した「なぜ機能しないのですか?」ではなく、「オブジェクトapply(...)の行平均を取得するにはどうすればよいですか?」という元の質問から少し外れています。bigmemory私はグーグルで検索"r bigmemory rowmeans"し、ここに行き着きました:http: //www.stat.yale.edu/~jay/HPCwR/examples/bioinfo/bioinfo3.txt

興味深いスニペットを再現する:

# Get the row means, three different ways.

system.time({
  a <- rep(0, nrow(z))
  for (i in 1:nrow(z)) {
    a[i] <- mean(z[i,])
  }
}) # Will definitely work on both matrix and big.matrix
   # matrix timing: about 30 seconds
   # big.matrix timing: about 270 seconds
   #    The price for using bigmemory with lots of very small
   #    operations is the overhead of S3/S4 dispatch.

system.time({
  a <- apply(z, 1, mean)
}) # Works on a matrix only; interesting that it is slower.
   # matrix timing: 45 seconds 

system.time({
  myfunc <- function(i) return(mean(z[i,]))
  a <- sapply(1:nrow(z), myfunc)
}) # Will definitely work on both matrix and big.matrix
   # matrix timing:     About 40 seconds
   # big.matrix timing: About 306 seconds

この例では、並列メソッド(doMCなど)を使用して行の平均を計算する方法を示します。

于 2012-12-24T17:17:22.110 に答える