4 回答
TA貢獻(xiàn)1876條經(jīng)驗(yàn) 獲得超5個贊
我最初沒有看到這個問題,并在幾天后問了一個類似的問題。我將把我之前的問題記下來,但我想我會在這里添加一個答案來解釋我以前是怎么sqldf()做的。
關(guān)于將2GB或更多文本數(shù)據(jù)導(dǎo)入R數(shù)據(jù)幀的最佳方法,已經(jīng)進(jìn)行了一些討論。昨天我寫了一篇關(guān)于使用sqldf()將數(shù)據(jù)導(dǎo)入SQLite作為臨時(shí)區(qū)域的博客文章,然后將其從SQLite吸入R中。這對我來說非常有用。我能夠在<5分鐘內(nèi)輸入2GB(3列,40mm行)的數(shù)據(jù)。相比之下,該read.csv命令整晚都沒有完成。
這是我的測試代碼:
設(shè)置測試數(shù)據(jù):
bigdf <- data.frame(dim=sample(letters, replace=T, 4e7), fact1=rnorm(4e7), fact2=rnorm(4e7, 20, 50))write.csv(bigdf, 'bigdf.csv', quote = F)
我在運(yùn)行以下導(dǎo)入例程之前重新啟動了R:
library(sqldf)f <- file("bigdf.csv")system.time(bigdf <- sqldf("select * from f", dbname = tempfile(), file.format = list(header = T,
row.names = F)))我讓以下一行整夜運(yùn)行,但它從未完成:
system.time(big.df <- read.csv('bigdf.csv'))TA貢獻(xiàn)1826條經(jīng)驗(yàn) 獲得超6個贊
奇怪的是,多年來沒有人回答問題的底部,即使這是一個重要的部分 - data.frame只是具有正確屬性的列表,所以如果你有大數(shù)據(jù),你不想使用as.data.frame或類似的列表。簡單地將列表“轉(zhuǎn)”為就地?cái)?shù)據(jù)框要快得多:
attr(df, "row.names") <- .set_row_names(length(df[[1]]))class(df) <- "data.frame"
這不會使數(shù)據(jù)副本立即生成(與所有其他方法不同)。它假定您已經(jīng)相應(yīng)地設(shè)置names()了列表。
[至于將大數(shù)據(jù)加載到R中 - 我個人將它們按列轉(zhuǎn)儲到二進(jìn)制文件中并使用readBin()- 這是迄今為止最快的方法(除了映射)并且僅受磁盤速度的限制。與二進(jìn)制數(shù)據(jù)相比,解析ASCII文件本質(zhì)上很慢(即使在C中)。
- 4 回答
- 0 關(guān)注
- 726 瀏覽
添加回答
舉報(bào)
