規模數據導入高效方式︱將數據快速讀入R—readr和readxl包

本文由雪晴數據網負責翻譯整理,原文請參考New packages for reading data into R — fast作者David 
Smith。轉載請註明原文鏈接http://www.xueqing.tv/cms/article/102

 

Hadley Wickham 和 RStudio團隊寫了一些新的R包,這些包對於每個需要在R中讀入數據的人來說都是非常有用的。readr包提供了一些在R中讀入文本數據的函數。readxl包提供了一些在R中讀入Excel電子表格數據的函數。它們的讀取速度遠遠超過你目前正在用的一些函數。

readr包提供了若干函數在R中讀取數據。我們通常會用R中的read.table家族函數來完成我們的數據讀入任務。這裏,readr包提供了許多替代函數。它們增加了額外的一些功能並且速度快很多。

首先,read_table幾乎代替了read.table。下面通過讀取一個包含400萬行的數據來比較它們的區別。點擊這裏下載該數據。

注1:在演示之前簡單說下我電腦的配置:win7,64位操作系統,8G內存,CPU A6雙核。電腦配置不行,原文給出的實驗時間甩了我好幾條街。但不管怎樣,在現有的條件下效率確實提高了很多。原文用時見末尾鏈接。

注2:如果讀取中文數據出現亂碼,在編輯器設置下字符編碼爲”UTF-8”

system.time(read_table("C:\\Users\\a\\Desktop\\biggerfile.txt",
                       col_names=c("DAY","MONTH","YEAR","TEMP")))

system.time(read.table("C:\\Users\\a\\Desktop\\biggerfile.txt",
                       col.names=c("DAY","MONTH","YEAR","TEMP")))

這些命令看上去非常相似,但是read.table花的時間是50.62秒,而read_table完成相同的任務只花了2.76秒。這是因爲read_table把數據當做是固定格式的文件,並且使用C++快速處理數據。

R中的基礎包utils也有讀取固定寬度數據的函數,下面的示例就能體現出readr的亮點:

system.time(read_fwf("C:\\Users\\a\\Desktop\\biggerfile.txt", 
                      fwf_widths(c(3,15,16,12),
                      col_names=c("DAY","MONTH","YEAR","TEMP"))))

system.time(read.fwf("C:\\Users\\a\\Desktop\\biggerfile.txt", 
                     c(3,15,16,12),
                     col.ames=c("DAY","MONTH","YEAR","TEMP")))

readr包的read_fwf函數用時3.97秒,而標準的read.fwf函數耗時1372秒。

readr包中的其它函數包括:read_csv讀取逗號分隔的數據(歐洲用的是read_csv2函數),read_tsv讀取製表符分隔數據,read_lines函數從文件中逐行讀取數據(非常適合複雜的後期處理)。它還可以讀取多種格式的日期時間列,智能的將文本數據讀取爲字符串(不再需要設置strings.as.factors=FALSE)。

 對於Excel格式的數據,這裏有readxl包。這個包提供的函數可以讀取.xls和.xlsx格式的Excel工作表。雖然這裏沒有演示read_execl函數的使用,但是它跟readr中的函數一樣都是基於C++庫的,因此讀取速度應該也很快。最重要的是,它沒有任何的外部依賴,因此你可以在任意平臺上用它來讀取數據—不要求安裝了Excel。

 

readr包已發佈在CRAN上,readxl可從github安裝。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章