21

2つのデータフレームがdf1ありdf2、それぞれに約1,000万行と4列があります。RODBC / sqlQueryを使用して問題なくRに読み込みましたが、試したところrbind、最も恐ろしいRエラーメッセージが表示されcannot allocate memoryました。より効率的に行うためのrbindより効率的な方法が必要です-誰かがこれについて彼らが共有したい彼らの好きなトリックを持っていますか?たとえば、私はこの例を次のドキュメントで見つけましたsqldf

# rbind
a7r <- rbind(a5r, a6r)
a7s <- sqldf("select * from a5s union all select * from a6s")

それはそれを行うための最良の/推奨される方法ですか?

更新JDLongがこの質問への回答で示唆しているように、上記の呼び出し 重要なdbname = tempfile()議論sqldf

4

4 に答える 4

26

最初にそれらをRに読み込んでから結合するのではなく、SQLiteに読み取らせて、Rに送信する前に結合させることができます。これにより、ファイルがRに個別にロードされることはありません。

# create two sample files
DF1 <- data.frame(A = 1:2, B = 2:3)
write.table(DF1, "data1.dat", sep = ",", quote = FALSE)
rm(DF1)

DF2 <- data.frame(A = 10:11, B = 12:13)
write.table(DF2, "data2.dat", sep = ",", quote = FALSE)
rm(DF2)

# now we do the real work
library(sqldf)

data1 <- file("data1.dat")
data2 <- file("data2.dat")

sqldf(c("select * from data1", 
 "insert into data1 select * from data2", 
 "select * from data1"), 
 dbname = tempfile())

これは与える:

>  sqldf(c("select * from data1", "insert into data1 select * from data2", "select * from data1"), dbname = tempfile())
   A  B
1  1  2
2  2  3
3 10 12
4 11 13

この短いバージョンは、行の順序が重要でない場合にも機能します。

sqldf("select * from data1 union select * from data2", dbname = tempfile())

詳細については、sqldfホームページhttp://sqldf.googlecode.comおよび?sqldfを参照してください。ファイル形式の引数は近いですが、とは異なりますので、特に注意してread.tableください。ここではデフォルトを使用しているので、それほど問題にはなりませんでした。

于 2011-01-21T17:26:00.593 に答える
20

data.table数百万を超えるレコードを持つオブジェクトを効率的に操作するためのRパッケージに注目してください。

そのパッケージのバージョン1.8.2は、rbindlist非常に効率的に目的を達成できる機能を提供します。したがって、rbind(a5r, a6r)あなたの代わりに次のことができます。

library(data.table)
rbindlist(list(a5r, a6r))
于 2012-08-27T19:34:22.253 に答える
1

希望のサイズを作成してみてくださいdata.frame。したがって、下付き文字を使用してデータをインポートします。

dtf <- as.data.frame(matrix(NA, 10, 10))
dtf1 <- as.data.frame(matrix(1:50, 5, 10, byrow=TRUE))
dtf2 <- as.data.frame(matrix(51:100, 5, 10, byrow=TRUE))
dtf[1:5, ] <- dtf1
dtf[6:10, ] <- dtf2

rbind寸法を事前に割り当てずにオブジェクトを成長させると思います...はっきりとはわかりませんが、これは単なる推測です。今夜は「TheRInferno」または「DataManipulationwithR」をくまなく調べます。多分mergeトリックをするでしょう...

編集

そして、(多分)あなたのシステムやRはそれほど大きなものに対処できないことを心に留めておくべきです。RevolutionRを試してみてください。時間やリソースを節約できるかもしれません。

于 2011-01-21T16:56:56.293 に答える
1

大きなファイルの結合に関するこのスレッドの完全性については、ファイルに対してシェルコマンドを使用してそれらを結合してみてください。「/B」フラグを指定した「COPY」コマンドであるWindowsの場合。例:

system(command =
         paste0(
           c("cmd.exe /c COPY /Y"
             , '"file_1.csv" /B'
             , '+ "file_2.csv" /B'
             , '"resulting_file.csv" /B'
           ), collapse = " "
         )
)#system

ファイルにヘッダーがなく、同じ区切り文字などが必要です。シェルコマンドの速度と汎用性が大きなメリットになる場合があるため、データフローをマッピングするときはCLIコマンドを忘れないでください。

于 2016-07-08T09:31:18.863 に答える