當處理大量資料集時,面臨的挑戰包括收集、準備和管理來自各種不同來源的資料。盡管通過學習後面章節中的真實世界的機器學習任務,我們會深入地涉及資料準備、資料清理和資料管理,但本節重點講述基本的r資料導入和導出功能。
當你花費了很長時間把某個資料框轉換成你所需要的資料格式時,你不必每次重新打開r會話從頭開始重複前面的工作。要想把一種特定的資料結構儲存到一個檔案中,使它以後能重新載入或者把這種資料結構轉移到另一個系統中,可以用save()函數。save()函數把r資料結構寫到由file參數設定的位置。r資料檔案有一個檔案擴充名.rdata。
如果我們有3個對象x、y和z,你希望将它們儲存在一個永久檔案中。不管它們是向量、因子、清單或者資料框,可以用下面的指令把它們儲存到名稱為mydata.rdata的檔案中:
load()指令可以重新建立儲存在以.rdata為擴充名的檔案中的任何資料結構。為了載入儲存在前面代碼中的mydata.rdata檔案,隻需要輸入:
這将重新建立x、y和z資料結構。
要特别小心你正在載入的資料結構!你用load()指令正在導入的檔案中所存儲的所有資料結構都将載入你的工作區,即使它們會覆寫工作區中其他一些你正在使用的東西。
如果你需要立即結束目前的r會話,save.image()指令将會把你所有的會話寫入一個叫作.rdata的檔案中。預設情況下,r将在下次啟動時尋找這個檔案,上次r結束時的r會話将會重制,就像你離開r時一樣。
在r會話工作一段時間後,可能積累了大量的資料結構。清單函數ls()傳回一個記憶體中目前所有資料結構的一個向量。例如,如果你按照本章中的代碼操作,那麼ls()函數将傳回:
在退出會話時,r将自動從記憶體中删除這些資料結構,但是對于大的資料結構,你可能希望盡快釋放記憶體。删除函數rm()就是用于删除資料結構。例如,為了删除m和subject1對象,簡單地輸入:
也可以用一個由需要删除的對象名稱構成的字元向量作為函數 rm()的參數。下面的指令清除整個r會話中的對象。
在執行上述指令時必須特别小心,因為在對象删除之前沒有提示。
公開的資料集通常存儲在文本檔案中。文本檔案幾乎可以在所有的計算機和作業系統中閱讀,這種格式幾乎全球通行。由于像microsoft excel這樣的電子表格資料操作容易便捷,是以文本格式檔案也能從這樣的程式中導入或者導出。
表格資料檔案(tabular或者table)采用矩陣形式的結構,這種形式資料的每一行表示一個案例,每個案例有相同數量的特征。每一行的特征值由一個預先定義的稱為分隔符的符号來區分。通常情況下,表格資料檔案的第一行給出資料每一列的名稱。該行稱為标題行。
最常用的表格文本檔案格式可能是逗号分隔值(comma-separated value,csv)檔案。根據名字可知,這種檔案格式使用逗号作為分隔符。csv檔案能在很多常用的應用程式内導入和導出。一個表示先前建構的醫療資料集的csv檔案可能像下面這樣存儲:
給定一個位于r工作目錄中的命名為pt_data.csv的病人資料檔案,可以使用read.csv()函數把這個檔案載入r中:
這個指令将把csv檔案讀入名為pt_data的資料框中。就像先前在建構資料框時那樣,我們需要使用stringsasfactors = false參數來阻止r把所有的文本變量轉換成因子。這個轉換的步驟最好由你而不是由r來執行。
如果資料集在r工作目錄之外,你要詳細列出csv檔案的完整路徑(例如,當調用read.csv()函數時應該使用/path/to/mydata.csv。)
預設情況下,r假設csv檔案包含一個标題行,标題行列出了資料集中特征的名字。如果一個csv檔案沒有标題行,那麼需要指定選項header = false,就像下面的指令顯示的那樣,r用v1、v2等預設值來指定屬性名:
read.csv()函數是read.table()函數的一個特例。read.table()函數能讀取具有多種不同格式的表格資料,包括其他的分隔形式,比如制表符分隔的值(tab-separated value,tsv)。要想了解更多關于read.table()函數族的資訊,用指令?read.table來查詢r的幫助頁面。
要想把一個資料框儲存成csv檔案,需要使用write.csv()函數。如果資料框名是pt_data,隻需要輸入:
這就将把一個名為pt_data.csv的檔案儲存到r工作目錄中。參數row.names會覆寫r的預設設定,它輸出csv檔案中的行名稱。除非資料框有行名,否則這種輸出設定是不必要的,它隻會增加輸出檔案的大小。