1. 程式人生 > >規模資料匯入高效方式︱將資料快速讀入R—readr和readxl包

規模資料匯入高效方式︱將資料快速讀入R—readr和readxl包

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

昨天在新電腦使用xlsx包的時候,因為載入rJava十分不悅…於是用了readxl,不要太方便,於是轉一篇過來備用著。以後讀入都用你了~

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安裝。