0

リスト A と B の 2 つのリストがあり、A と B にはそれぞれ 100 個のデータ フレームが含まれ、各データ フレームのサイズは 25000 X 25000 です。次の方法でデータ フレーム全体の相関関係を見つけたいと思います。両方のリストにリストし、cor (A,B) を見つけて、データフレーム全体に相関する単一の値を取得します。同様に、両方のリストの 2 番目のリストを検討し、cor(A,B) を見つけて、100 個のデータフレームについてこれを続けます。

私は次のことを試しました:

  A # list of 100 dataframes

  $1 ### dataframe 1
  $2
  $3
  ....
  $100   ### dataframe 100
  B #list of 100 dataframes

  $1 ### dataframe 1
  $2
  $3
  ....
  $100   ### dataframe 100
  C<- A[1] # extract only the first list from A
  D<- B[1] # extract only the first list from B

  C<-unlist(C) ### unlist C
  D<-unlist(D) ## unlist D

次に計算

   Correlation<- cor(C,D) ## to obtain a single correlation coefficient to see how these two vectors are correlated         

しかし、私は言うエラーで終わります

  R cannot allocate a vector of size 3.9 GB

リスト全体に実装できるより高速な方法でこれを行うより良い方法はありますか。大きな値を計算できるサーバーで作業していますが、それでもこのエラーが表示され、データフレームのサイズが原因でリストからの削除に時間がかかります。

4

3 に答える 3

4

2 つのサブリストを作成しましたが、実際にはデータフレームまたはベクトルを抽出しませんでした。

Correlation<- cor(A[[1]][[1]], B[[1]][[1]])

A[[1]]は最初のデータフレームを返し(実際にオブジェクトが記述どおりであった場合)、追加[[1]]は最初の列を原子ベクトルとして返し、関数の要件に一致しますcor。「データフレーム全体の相関関係」または「リスト全体に実装できるより高速な方法」の意味が少しわかりません。lapply()またはfor-loop を使用して、データフレームのリストまたはデータフレームの列を反復処理できます。より適度なサイズの2つまたは3つのデータフレームのリストを作成してみませんか。誰かがこれらの方法の1つまたは両方を行う方法を示すことができます. または、「Introduction to R」などの入門資料を読むこともできます。

于 2013-09-30T06:45:24.713 に答える
2

直接的な答えではありませんが、メモリの問題に対処するために、memory.limit(8000)(8000MB)を使用して割り当てられた RAM を増やすことができます。

于 2013-09-30T07:08:13.000 に答える
1

ここでいくつかの問題。まず第一に、データフレームは、サイズが 25000x25000 の行列を適切に表現できない場合があります。通常、データ フレームには少数の列と多数の行があります。すべての列が同じデータ型である場合 (そうであると思われます)、データに対して他に何をする必要があるかに応じて、行列を操作することを検討できます。

次に、unlist長い時間がかかる理由はunlist、基本的に への繰り返し呼び出しを使用して単純に実装されているように見えることc()です (ソースを確認して確認できます)。代わりにこれを試してください:

C<-as.vector(as.matrix(C))

これにより、より効率的な方法で C がマトリックスに変換され、ディメンション属性を削除するだけで、探しているベクトルが得られます。

次に、かなり大きなデータセットを扱っており、取得しているエラーは、使用可能な RAM の限界を超えていることを意味します。unlistへの呼び出し中またはへの呼び出し中にメモリ エラーが発生しましたcorか? R 端子の正確な出力を提供していただけると助かります。

as.vector(as.matrix(C))ではなくを使用して計算を行い、それが機能するかどうかを確認することをお勧めしますunlist(C)。そうでない場合は、いくつかの呼び出しの間にガベージ コレクション (つまり、 を呼び出すgc()) を試してください。

リスト全体に対して操作を行う限り、単純に を使用できますmapply。ただし、メモリの問題がある場合は、洗練されていない命令型コードを記述して、何が起こっているかをより正確に制御することをお勧めします。このようなものは簡単です:

corvec<-rep(0,100)
for(i in 1:100){
  gc()
  C<-as.vector(as.matrix(A[[i]]))
  D<-as.vector(as.matrix(B[[i]]))
  corvec[i]<-cor(C,D)
}
于 2013-09-30T12:31:44.437 に答える