天天看點

《R語言資料分析》----第1章 你好,資料! 1.1 導入一個大小合适的文本檔案

本節書摘來自華章出版社《r語言資料分析》一書中的第1章,第1.1節,作者蓋爾蓋伊·道羅齊(gergely daróczi),潘怡 譯,更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。

大多數r項目都必須從資料導入到r的會話中開始,由于r語言能夠支援多種檔案格式和資料庫背景,是以可以使用相當多的資料導入方法。本章,我們不會再讨論基礎的資料結構,因為你應該已經對它們非常熟悉了。本章的重點将放在大資料集的導入以及處理一些特殊的檔案類型。

盡管r語言擁有其自己的(序列化)二進制rdata及rds檔案格式類型,這種檔案格式也可以非常友善地被r使用者用來存放r對象的中繼資料資訊。但大多數時候,我們還是需要能夠處理一些由我們的客戶或老闆要求使用的其他類型資料。

平面檔案是這其中最常見的一類資料檔案,在這樣的檔案中,資料存放在簡單的文本檔案中,資料值之間通常會以空格、逗号,或者更常見的分号隔開。本章将對r語言提供的幾種用于裝載這些類型文檔的方法展開讨論,并就哪種方法最适合于導入大資料集進行測試。

某些時候,我們也可能僅對一個資料集的子集感興趣,并不需要對整個資料集進行處理。由于資料存放在資料庫時都是以結構化的方式進行預處理的,是以,我們可以隻使用簡單并且有效的指令就可以查詢得到我們需要的子集。本章1.4節将着重探讨三類最常用的資料庫系統(mysql、postgresql和oracle)與r進行互動的方法。

除了對部分常用工具以及其他一些資料庫背景進行一個簡要說明外,本章還将展示如何将excel電子表格導入到r中,這種導入并不需要事先将電子表格檔案轉換為excel文本檔案或open/libreoff?ice格式檔案。

當然,本章要讨論的内容絕不僅僅局限于檔案格式、資料庫連接配接以及類似一些讓人提不起興趣的内容。不過,請記住資料分析工程師總是首先從導入資料起步,這一部分的工作是不可回避的,必須要保證我們的機器和統計環境在進行實際的分析之前首先先弄清楚資料的結構。

本章的标題也可以換成“你好,大資料!”因為本章主要探讨如何将大資料裝載到r會話中。但是,到底什麼是大資料呢?究竟在r中處理多大規模的資料量會比較困難呢?合适的規模怎麼定義呢?

r原本是為處理單機規模的資料而設計的,是以比較适合資料集規模小于實際可用的ram大小的情況,但要注意有時候我們必須考慮在做一些計算操作時,程式對記憶體的需求會增加,例如主成分分析。在本節中,将這類規模的資料集稱為大小合适的資料集。

在r中完成從文本導入資料的操作非常簡單,可以調用read.table函數來處理任何規模合适的資料集,唯一要考慮的就是資料讀寫所需的時間。例如,25萬行的資料集?可以參見:

《R語言資料分析》----第1章 你好,資料! 1.1 導入一個大小合适的文本檔案

沒錯,我們剛剛從hf?lights包中将18.5mb大小的文本檔案下載下傳到硬碟上,該檔案包括了2011年從休斯頓(houston)起飛的航班的部分資料:

《R語言資料分析》----第1章 你好,資料! 1.1 導入一個大小合适的文本檔案
《R語言資料分析》----第1章 你好,資料! 1.1 導入一個大小合适的文本檔案

我們将使用這個包括了21列資料的資料集作為資料導入的測試平台。例如,使用read.csv測試導入csv檔案的時間。

《R語言資料分析》----第1章 你好,資料! 1.1 導入一個大小合适的文本檔案

從某個ssd站點下載下傳這些資料大約需要1.5秒,相對來說耗時還算可以接受。我們可以指定列資料的轉換類型而不采用預設的type.convert(參見read.table的文檔獲得更多詳細資訊,在satckoverf?low的搜尋結果也表明有關read.csv的問題看起來是大家都很關心也經常提問的内容)來提高速度。

《R語言資料分析》----第1章 你好,資料! 1.1 導入一個大小合适的文本檔案

這個結果已經好了很多!但它可信嗎?在使用r語言掌握資料分析的道路上,我們還将實踐更多可靠的測試——對同一任務重複n次測試,然後再對仿真結果進行彙總。通過這個方法,我們可以得到關于資料的多種觀測結果,并将它們用于分析确定結果中的統計的顯著差異。microbenchmark包就為類似任務提供了一個非常好的架構:

《R語言資料分析》----第1章 你好,資料! 1.1 導入一個大小合适的文本檔案
《R語言資料分析》----第1章 你好,資料! 1.1 導入一個大小合适的文本檔案

我們定義了兩個函數:函數f為read.csv的預設設定,在函數g中,我們對之前兩列資料類型進行了更新以提高執行效率。其中,參數comment.char将通知r不需要在被導入的檔案中尋找注釋,參數comment.char确定了從檔案中導入的行數,以節約導入操作所需的部分時間和空間。将stringasfactors設定為false也可以提高一點檔案導入速度。

回到對結果的分析中,我們可以在圖形中來展現中位數以及一些其他相關統計值,這些結果都是預設運作100次所得:

《R語言資料分析》----第1章 你好,資料! 1.1 導入一個大小合适的文本檔案

兩者之間的差異看起來非常明顯(讀者也可以通過其他一些統計實驗來驗證這個結果),僅通過read.table函數的參數調優,我們就将性能提高了50%以上。

如果從csv檔案中導入的資料集大小超過了機器的實體記憶體,可以調用一些專為這類應用而設計的使用者開發包。例如,sqldf包和ff包都支援基于特定資料類型以chunk到chunk方式裝載資料集。前者使用sqlite或者類似sql的資料庫背景,而後者則使用與ffdf類對應的資料框将資料存儲到硬碟上。bigmemory包也提供了類似的功能。稍後将介紹相關的樣例(可用于測試):

《R語言資料分析》----第1章 你好,資料! 1.1 導入一個大小合适的文本檔案

!

《R語言資料分析》----第1章 你好,資料! 1.1 導入一個大小合适的文本檔案