R 的 rio 套件是一個綜合型的檔案匯入與匯出工具套件,支援各種常見的檔案格式。
當我們要把資料從別的軟體匯入 R 中,或是要從 R 中匯出資料到別的軟體時,都會需要處理各式各樣檔案格式的轉換問題,傳統上不同的檔案格式會需要使用不同的匯入與匯出方式,而所需要安裝的套件也不同,當然使用方法也會有很大的差異,所以不是很方便。
rio 這個套件則是將各種常見的資料格式都整合起來,變成一個萬用型的資料匯入與匯出工具,它會自動判斷檔案的格式,選擇適合的方式來處理,讓操作介面統一,使用上更單純。
安裝 rio 套件
rio 這個套件是 R 官方收錄的套件之一,所以可以使用 install.packages
直接安裝:
install.packages("rio")
安裝好之後,載入 rio
套件:
library(rio)
將樣就可以開始使用了。
rio 所支援的檔案格式相當多,完整的檔案格式列表可以從 rio 官方的文件上查詢。
匯出資料
rio
所提供的 export
函數可以將 R 的 data frame 匯出成各種的檔案格式:
export(iris, "iris.csv") # CSV 檔 export(iris, "iris.rds") # RDS 檔 export(iris, "iris.dta") # Stata 檔
匯入資料
import
則可以自動匯入各種檔案格式:
iris.1 <- import("iris.csv") # CSV 檔 iris.2 <- import("iris.rds") # RDS 檔 iris.3 <- import("iris.dta") # Stata 檔
對於沒有副檔名的檔案,可以自行指定檔案的格式。例如匯入一個沒有副檔名的逗點分隔(csv)檔:
iris.4 <- import("iris_noext", format = "csv")
某些檔案格式可能會包含許多張資料表格,這時候可以使用 which
參數來指定要匯入哪一張表格,例如讀取 Excel 檔的第二張表格:
my_file.1 <- import("my_file.xlsx", which = 2)
內部參數
rio
實際上做的事情就是自動判斷檔案的格式,然後依照檔案格式,呼叫對應的檔案匯入或匯出工具,我們也可以將特定的參數傳給 rio
背後所呼叫的函數,調整檔案匯入或匯出時的選項,以下是一個 Fixed Width Format 檔案格式的範例。
首先產生一個 Fixed Width Format 檔案:
# 建立一個 fwf 暫存檔 fwf <- tempfile(fileext = ".fwf") # 寫入檔案內容 cat(file = fwf, "123456", "987654", sep = "\n")
rio
在讀取 fwf
這種檔案時,內部其實是使用 read.fwf
這個函數來讀取的,我們可以在 import
的參數中直接指定 read.fwf
函數所需要的 widths
參數:
# 資料欄位寬度為 1, 2, 3 import(fwf, widths = c(1, 2, 3))
V1 V2 V3 1 1 23 456 2 9 87 654
# 資料欄位寬度為 1, 2, 3,丟棄第 2 欄 import(fwf, widths = c(1, -2, 3))
V1 V2 1 1 456 2 9 654
測試完成後,把剛剛建立的暫存檔刪除:
unlink(fwf)
檔案格式轉換
rio
的 convert
可以處理不同資料格式之間的轉換工作,事實上他就是結合 import
與 export
將資料匯入之後再以不同的格式匯出而已,使用方式如下:
# 輸出測試用的 Stata 檔 export(iris, "iris.dta") # 將 Stata 檔轉為 SPSS 檔 convert("iris.dta", "iris.sav")
在呼叫 convert
時,我們可以透過 in_opts
與 out_opts
參數指定 import
與 export
用的參數:
# 建立測試用的暫存檔 fwf <- tempfile(fileext = ".fwf") csv <- tempfile(fileext = ".csv") # 寫入檔案內容 cat(file = fwf, "123456", "987654", sep = "\n") # 將 fwf 檔轉為 csv 檔 convert(fwf, csv, in_opts = list(widths = c(1, 2, 3))) # 匯入轉好的 csv 檔 import(csv) # 刪除測試用的暫存檔 unlink(fwf) unlink(csv)