本文由雪晴數據網負責翻譯整理,原文請參考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安裝。